{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 最小二乘（Generalized Least Squares）\n",
    "\n",
    "## 1. 最小二乘的基本\n",
    "\n",
    "最小二乘法（generalized least squares）是一种数学优化技术，它通过最小化误差的平方和找到一组数据的最佳函数匹配。 最小二乘法通常用于曲线拟合、求解模型。很多其他的优化问题也可通过最小化能量或最大化熵用最小二乘形式表达。最小二乘原理的一般形式为：\n",
    "$$\n",
    "L = \\sum (V_{obv} - V_{target}(\\theta))^2\n",
    "$$\n",
    "其中$V_{obv}$是我们观测的多组样本值，$V_{target}$是我们假设拟合函数的输出值，$\\theta$为构造模型的参数。$L$是目标函数，如果通过调整模型参数$\\theta$，使得$L$下降到最小则表明，拟合函数与观测最为接近，也就是找到了最优的模型。\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 1.1 示例\n",
    "\n",
    "假设我们有下面的一些观测数据，我们希望找到他们内在的规律。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "%matplotlib inline\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "import numpy as np\n",
    "import sklearn\n",
    "from sklearn import datasets\n",
    "\n",
    "# load data\n",
    "d = datasets.load_diabetes()\n",
    "\n",
    "X = d.data[:, 2]\n",
    "Y = d.target\n",
    "\n",
    "# draw original data\n",
    "plt.scatter(X, Y)\n",
    "plt.xlabel(\"X\")\n",
    "plt.ylabel(\"Y\")\n",
    "plt.show()\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 1.2 数学原理\n",
    "有$N$个观测数据为：\n",
    "$$\n",
    "\\mathbf{X} = \\{x_1, x_2, ..., x_N \\} \\\\\n",
    "\\mathbf{Y} = \\{y_1, y_2, ..., y_N \\}\n",
    "$$\n",
    "其中$\\mathbf{X}$为自变量，$\\mathbf{Y}$为因变量。\n",
    "\n",
    "我们希望找到一个模型能够解释这些数据，假设我们使用最简单的线性模型来拟合数据：\n",
    "$$\n",
    "y = ax + b\n",
    "$$\n",
    "那么问题就变成求解参数$a$, $b$能够使得模型输出尽可能和观测数据有比较小的误差。\n",
    "\n",
    "如何构建函数来评估模型输出与观测数据之间的误差是一个关键问题，这里我们使用观测数据与模型输出的平方和来作为评估函数（也被称为损失函数Loss function):\n",
    "$$\n",
    "L = \\sum_{i=1}^{N} (y_i - a x_i - b)^2 \\\\\n",
    "L = \\sum_{i=1}^{N} \\{y_i - (a x_i + b)\\}^2\n",
    "$$\n",
    "\n",
    "使误差函数最小，那么我们就可以求出模型的参数:\n",
    "$$\n",
    "\\frac{\\partial L}{\\partial a} = -2 \\sum_{i=1}^{N} (y_i - a x_i - b) x_i \\\\\n",
    "\\frac{\\partial L}{\\partial b} = -2 \\sum_{i=1}^{N} (y_i - a x_i - b)\n",
    "$$\n",
    "既当偏微分为0时，误差函数为最小，因此我们可以得到:\n",
    "$$\n",
    "-2 \\sum_{i=1}^{N} (y_i - a x_i - b) x_i = 0 \\\\\n",
    "-2 \\sum_{i=1}^{N} (y_i - a x_i - b) = 0 \\\\\n",
    "$$\n",
    "\n",
    "将上式调整一下顺序可以得到：\n",
    "$$\n",
    "a \\sum x_i^2 + b \\sum x_i = \\sum y_i x_i \\\\\n",
    "a \\sum x_i + b N = \\sum y_i\n",
    "$$\n",
    "通过求解二元一次方程组，我们即可求出模型的最优参数。"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 1.3 求解程序"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "a = 949.435260, b = 152.133484\n"
     ]
    },
    {
     "data": {
      "image/png": "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h+gw1WgeffRRysrKPLVDEUm6LVhKBumaeExhjbLo40BKiZSSd955x3bf8ePHJ6FF9jz66KNcc801ZGdnp7opNZq6atmmY1inwp5aY9Enwrp6+OGH6dKlC126dOHRUL6djRs30rFjR4YMGUKXLl3YvHlzRMGQe++9l44dO3LmmWdy9dVX8+CDDwIwbNgwZs6cCWgFRsaMGcPJJ59M165dWbNmDQCLFy/m9NNPJy8vjzPOOIO1a62tpPLycq666ipOOOEELr30UsrLD3/Z/vSnP5Gfn0/nzp0ZM2YMAI899hhbt26lT58+9OnTx3Q/hT111bI1C99MdVinwppaYdEnwrpaunQpzz//PF9++SVSSk477TTOPvtsmjRpwrp165g6dSo9e/aMOOarr75i1qxZLF++nGAwyMknn0yPHj0Mz9+sWTO+/vprnnrqKR588EH+85//0KlTJz799FPq1avHBx98wB133FGdGdOIp59+muzsbFavXs2KFSs4+eSTq9+77777aNq0KZWVlZx77rmsWLGCW265hYcffpgFCxbQrFkz0/26devm6Z7VJeqqZasSj7mgshIyM+33SwK1QujjzZpnxGeffcall15Ko0aNALjsssv49NNPGThwIO3atYsReYCFCxcyaNAgGjZsSMOGDbnkkktMz3/ZZZcB0KNHj+p0xnv37mXo0KGsW7cOIQTBYNCyjZ988gm33HILAN26dYsQ6Ndee40pU6ZQUVHBtm3b+Pbbbw0F3Ol+iSTdojictMfpgqWa2DcrVFinA9auhTvvhCOPhOefT3VrgFoi9Mm2rnTxjwc93XFmZiYVFRUA3H333fTp04fZs2ezceNGzjnnHE/n/v7773nwwQf56quvaNKkCcOGDePAgQOe90sk6ebrdtoeJ5ZtTe2bHWr1qwklJTBuHDz3HGRlwahRICUIkeqW1Q4ffSL8hmeddRZFRUWUlZWxf/9+Zs+ezVlnnWV5TK9evXjrrbc4cOAA+/bt4+2333Z1zb1795Kbq32BXnjhBdv9w1Mhf/PNN9VlDH/++WcaNWpE48aN2b59O++++271MUceeSS//PKL7X7JIt183U7b4ySlbk3tWzpQoyKa9uyBwkI47jh44QW4+WbYsAHuuistRB5qiUWfCL/hySefzLBhwzj11FMB+MMf/kBeXh4bN240PeaUU05h4MCBdOvW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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "N = X.shape[0]\n",
    "\n",
    "S_X2 = np.sum(X*X)\n",
    "S_X  = np.sum(X)\n",
    "S_XY = np.sum(X*Y)\n",
    "S_Y  = np.sum(Y)\n",
    "\n",
    "A1 = np.array([[S_X2, S_X], \n",
    "               [S_X, N]])\n",
    "B1 = np.array([S_XY, S_Y])\n",
    "\n",
    "coeff = np.linalg.inv(A1).dot(B1)\n",
    "\n",
    "print('a = %f, b = %f' % (coeff[0], coeff[1]))\n",
    "\n",
    "x_min = np.min(X)\n",
    "x_max = np.max(X)\n",
    "y_min = coeff[0] * x_min + coeff[1]\n",
    "y_max = coeff[0] * x_max + coeff[1]\n",
    "\n",
    "plt.scatter(X, Y, label='original data')\n",
    "plt.plot([x_min, x_max], [y_min, y_max], 'r', label='model')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2. 如何使用迭代的方法求出模型参数\n",
    "\n",
    "当数据比较多的时候，或者模型比较复杂，无法直接使用解析的方式求出模型参数。因此更为常用的方式是，通过迭代的方式逐步逼近模型的参数。\n",
    "\n",
    "### 2.1 梯度下降法\n",
    "在机器学习算法中，对于很多监督学习模型，需要对原始的模型构建损失函数，接下来便是通过优化算法对损失函数进行优化，以便寻找到最优的参数。在求解机器学习参数的优化算法中，使用较多的是基于梯度下降的优化算法(Gradient Descent, GD)。\n",
    "\n",
    "梯度下降法有很多优点，其中最主要的优点是，在梯度下降法的求解过程中只需求解损失函数的一阶导数，计算的代价比较小，这使得梯度下降法能在很多大规模数据集上得到应用。梯度下降法的含义是通过当前点的梯度方向寻找到新的迭代点。\n",
    "\n",
    "梯度下降法的基本思想可以类比为一个下山的过程。假设这样一个场景：一个人被困在山上，需要从山上下来(i.e. 找到山的最低点，也就是山谷)。但此时山上的浓雾很大，导致可视度很低。因此，下山的路径就无法确定，他必须利用自己周围的信息去找到下山的路径。这个时候，他就可以利用梯度下降算法来帮助自己下山。具体来说就是，以他当前的所处的位置为基准，寻找这个位置最陡峭的地方，然后朝着山的高度下降的地方走，同理，如果我们的目标是上山，也就是爬到山顶，那么此时应该是朝着最陡峭的方向往上走。然后每走一段距离，都反复采用同一个方法，最后就能成功的抵达山谷。\n",
    "\n",
    "\n",
    "我们同时可以假设这座山最陡峭的地方是无法通过肉眼立马观察出来的，而是需要一个复杂的工具来测量，同时，这个人此时正好拥有测量出最陡峭方向的能力。所以，此人每走一段距离，都需要一段时间来测量所在位置最陡峭的方向，这是比较耗时的。那么为了在太阳下山之前到达山底，就要尽可能的减少测量方向的次数。这是一个两难的选择，如果测量的频繁，可以保证下山的方向是绝对正确的，但又非常耗时，如果测量的过少，又有偏离轨道的风险。所以需要找到一个合适的测量方向的频率，来确保下山的方向不错误，同时又不至于耗时太多！\n",
    "\n",
    "\n",
    "![gradient_descent](images/gradient_descent.png)\n",
    "\n",
    "如上图所示，得到了局部最优解。x,y表示的是$\\theta_0$和$\\theta_1$，z方向表示的是花费函数，很明显出发点不同，最后到达的收敛点可能不一样。当然如果是碗状的，那么收敛点就应该是一样的。\n",
    "\n",
    "对于某一个损失函数\n",
    "$$\n",
    "L = \\sum_{i=1}^{N} (y_i - a x_i - b)^2\n",
    "$$\n",
    "\n",
    "我们更新的策略是：\n",
    "$$\n",
    "\\theta^1 = \\theta^0 - \\alpha \\triangledown L(\\theta)\n",
    "$$\n",
    "其中$\\theta$代表了模型中的参数，例如$a$, $b$\n",
    "\n",
    "此公式的意义是：$L$是关于$\\theta$的一个函数，我们当前所处的位置为$\\theta_0$点，要从这个点走到L的最小值点，也就是山底。首先我们先确定前进的方向，也就是梯度的反向，然后走一段距离的步长，也就是$\\alpha$，走完这个段步长，就到达了$\\theta_1$这个点！\n",
    "\n",
    "下面就这个公式的几个常见的疑问：\n",
    "\n",
    "* **$\\alpha$是什么含义？**\n",
    "$\\alpha$在梯度下降算法中被称作为学习率或者步长，意味着我们可以通过$\\alpha$来控制每一步走的距离，以保证不要步子跨的太大，错过了最低点。同时也要保证不要走的太慢，导致太阳下山了，还没有走到山下。所以$\\alpha$的选择在梯度下降法中往往是很重要的。\n",
    "![gd_stepsize](images/gd_stepsize.png)\n",
    "\n",
    "* **为什么要梯度要乘以一个负号？**\n",
    "梯度前加一个负号，就意味着朝着梯度相反的方向前进！梯度的方向实际就是函数在此点上升最快的方向，而我们需要朝着下降最快的方向走，自然就是负的梯度的方向，所以此处需要加上负号。\n",
    "\n"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 2.2 示例代码"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch    0: loss = 4303817.496892, a = 2.826518, b = 90.332322\n",
      "epoch    1: loss = 2886806.756007, a = 4.689320, b = 127.204624\n",
      "epoch    2: loss = 2650260.562182, a = 6.564882, b = 142.423411\n",
      "epoch    3: loss = 2610244.478756, a = 8.443497, b = 148.704446\n",
      "epoch    4: loss = 2601826.873313, a = 10.321163, b = 151.296317\n",
      "epoch    5: loss = 2598022.583256, a = 12.196235, b = 152.365440\n",
      "epoch    6: loss = 2594693.583475, a = 14.068035, b = 152.806033\n",
      "epoch    7: loss = 2591324.277053, a = 15.936290, b = 152.987193\n",
      "epoch    8: loss = 2587904.879022, a = 17.800890, b = 153.061271\n",
      "epoch    9: loss = 2584465.875668, a = 19.661796, b = 153.091151\n",
      "epoch   10: loss = 2581025.689621, a = 21.518994, b = 153.102788\n",
      "epoch   11: loss = 2577592.886376, a = 23.372484, b = 153.106897\n",
      "epoch   12: loss = 2574171.135769, a = 25.222270, b = 153.107901\n",
      "epoch   13: loss = 2570761.947715, a = 27.068358, b = 153.107623\n",
      "epoch   14: loss = 2567365.917653, a = 28.910755, b = 153.106819\n",
      "epoch   15: loss = 2563983.260031, a = 30.749468, b = 153.105798\n",
      "epoch   16: loss = 2560614.031657, a = 32.584504, b = 153.104690\n",
      "epoch   17: loss = 2557258.224357, a = 34.415871, b = 153.103546\n",
      "epoch   18: loss = 2553915.803272, a = 36.243576, b = 153.102390\n",
      "epoch   19: loss = 2550586.722666, a = 38.067626, b = 153.101229\n",
      "epoch   20: loss = 2547270.932442, a = 39.888028, b = 153.100068\n",
      "epoch   21: loss = 2543968.380830, a = 41.704790, b = 153.098909\n",
      "epoch   22: loss = 2540679.015496, a = 43.517919, b = 153.097751\n",
      "epoch   23: loss = 2537402.783996, a = 45.327423, b = 153.096595\n",
      "epoch   24: loss = 2534139.633964, a = 47.133308, b = 153.095442\n",
      "epoch   25: loss = 2530889.513189, a = 48.935582, b = 153.094291\n",
      "epoch   26: loss = 2527652.369647, a = 50.734252, b = 153.093142\n",
      "epoch   27: loss = 2524428.151512, a = 52.529326, b = 153.091995\n",
      "epoch   28: loss = 2521216.807162, a = 54.320809, b = 153.090851\n",
      "epoch   29: loss = 2518018.285178, a = 56.108711, b = 153.089709\n",
      "epoch   30: loss = 2514832.534347, a = 57.893037, b = 153.088570\n",
      "epoch   31: loss = 2511659.503661, a = 59.673795, b = 153.087432\n",
      "epoch   32: loss = 2508499.142314, a = 61.450992, b = 153.086297\n",
      "epoch   33: loss = 2505351.399704, a = 63.224636, b = 153.085164\n",
      "epoch   34: loss = 2502216.225431, a = 64.994732, b = 153.084034\n",
      "epoch   35: loss = 2499093.569295, a = 66.761289, b = 153.082906\n",
      "epoch   36: loss = 2495983.381300, a = 68.524314, b = 153.081780\n",
      "epoch   37: loss = 2492885.611645, a = 70.283813, b = 153.080656\n",
      "epoch   38: loss = 2489800.210732, a = 72.039794, b = 153.079534\n",
      "epoch   39: loss = 2486727.129159, a = 73.792263, b = 153.078415\n",
      "epoch   40: loss = 2483666.317722, a = 75.541228, b = 153.077298\n",
      "epoch   41: loss = 2480617.727412, a = 77.286695, b = 153.076183\n",
      "epoch   42: loss = 2477581.309419, a = 79.028673, b = 153.075070\n",
      "epoch   43: loss = 2474557.015125, a = 80.767166, b = 153.073960\n",
      "epoch   44: loss = 2471544.796108, a = 82.502184, b = 153.072852\n",
      "epoch   45: loss = 2468544.604139, a = 84.233732, b = 153.071746\n",
      "epoch   46: loss = 2465556.391180, a = 85.961817, b = 153.070642\n",
      "epoch   47: loss = 2462580.109388, a = 87.686447, b = 153.069541\n",
      "epoch   48: loss = 2459615.711109, a = 89.407628, b = 153.068441\n",
      "epoch   49: loss = 2456663.148878, a = 91.125368, b = 153.067344\n",
      "epoch   50: loss = 2453722.375424, a = 92.839672, b = 153.066249\n",
      "epoch   51: loss = 2450793.343662, a = 94.550548, b = 153.065157\n",
      "epoch   52: loss = 2447876.006693, a = 96.258004, b = 153.064066\n",
      "epoch   53: loss = 2444970.317810, a = 97.962044, b = 153.062978\n",
      "epoch   54: loss = 2442076.230490, a = 99.662678, b = 153.061892\n",
      "epoch   55: loss = 2439193.698395, a = 101.359910, b = 153.060808\n",
      "epoch   56: loss = 2436322.675374, a = 103.053749, b = 153.059726\n",
      "epoch   57: loss = 2433463.115460, a = 104.744201, b = 153.058646\n",
      "epoch   58: loss = 2430614.972868, a = 106.431272, b = 153.057569\n",
      "epoch   59: loss = 2427778.201998, a = 108.114970, b = 153.056493\n",
      "epoch   60: loss = 2424952.757431, a = 109.795301, b = 153.055420\n",
      "epoch   61: loss = 2422138.593930, a = 111.472271, b = 153.054349\n",
      "epoch   62: loss = 2419335.666438, a = 113.145889, b = 153.053280\n",
      "epoch   63: loss = 2416543.930078, a = 114.816160, b = 153.052213\n",
      "epoch   64: loss = 2413763.340154, a = 116.483090, b = 153.051148\n",
      "epoch   65: loss = 2410993.852146, a = 118.146688, b = 153.050086\n",
      "epoch   66: loss = 2408235.421713, a = 119.806958, b = 153.049026\n",
      "epoch   67: loss = 2405488.004692, a = 121.463909, b = 153.047967\n",
      "epoch   68: loss = 2402751.557095, a = 123.117547, b = 153.046911\n",
      "epoch   69: loss = 2400026.035111, a = 124.767877, b = 153.045857\n",
      "epoch   70: loss = 2397311.395102, a = 126.414908, b = 153.044805\n",
      "epoch   71: loss = 2394607.593607, a = 128.058645, b = 153.043755\n",
      "epoch   72: loss = 2391914.587336, a = 129.699095, b = 153.042707\n",
      "epoch   73: loss = 2389232.333175, a = 131.336265, b = 153.041662\n",
      "epoch   74: loss = 2386560.788178, a = 132.970161, b = 153.040618\n",
      "epoch   75: loss = 2383899.909575, a = 134.600789, b = 153.039577\n",
      "epoch   76: loss = 2381249.654764, a = 136.228157, b = 153.038537\n",
      "epoch   77: loss = 2378609.981313, a = 137.852271, b = 153.037500\n",
      "epoch   78: loss = 2375980.846962, a = 139.473137, b = 153.036465\n",
      "epoch   79: loss = 2373362.209618, a = 141.090762, b = 153.035432\n",
      "epoch   80: loss = 2370754.027356, a = 142.705152, b = 153.034401\n",
      "epoch   81: loss = 2368156.258420, a = 144.316314, b = 153.033371\n",
      "epoch   82: loss = 2365568.861218, a = 145.924254, b = 153.032344\n",
      "epoch   83: loss = 2362991.794327, a = 147.528979, b = 153.031320\n",
      "epoch   84: loss = 2360425.016488, a = 149.130495, b = 153.030297\n",
      "epoch   85: loss = 2357868.486607, a = 150.728809, b = 153.029276\n",
      "epoch   86: loss = 2355322.163754, a = 152.323926, b = 153.028257\n",
      "epoch   87: loss = 2352786.007164, a = 153.915853, b = 153.027240\n",
      "epoch   88: loss = 2350259.976233, a = 155.504598, b = 153.026226\n",
      "epoch   89: loss = 2347744.030520, a = 157.090165, b = 153.025213\n",
      "epoch   90: loss = 2345238.129745, a = 158.672562, b = 153.024202\n",
      "epoch   91: loss = 2342742.233790, a = 160.251794, b = 153.023194\n",
      "epoch   92: loss = 2340256.302696, a = 161.827869, b = 153.022187\n",
      "epoch   93: loss = 2337780.296663, a = 163.400791, b = 153.021182\n",
      "epoch   94: loss = 2335314.176054, a = 164.970569, b = 153.020180\n",
      "epoch   95: loss = 2332857.901385, a = 166.537207, b = 153.019179\n",
      "epoch   96: loss = 2330411.433334, a = 168.100713, b = 153.018180\n",
      "epoch   97: loss = 2327974.732732, a = 169.661092, b = 153.017184\n",
      "epoch   98: loss = 2325547.760572, a = 171.218351, b = 153.016189\n",
      "epoch   99: loss = 2323130.477996, a = 172.772496, b = 153.015197\n",
      "epoch  100: loss = 2320722.846308, a = 174.323534, b = 153.014206\n",
      "epoch  101: loss = 2318324.826961, a = 175.871469, b = 153.013217\n",
      "epoch  102: loss = 2315936.381566, a = 177.416310, b = 153.012231\n",
      "epoch  103: loss = 2313557.471885, a = 178.958061, b = 153.011246\n",
      "epoch  104: loss = 2311188.059833, a = 180.496729, b = 153.010263\n",
      "epoch  105: loss = 2308828.107479, a = 182.032320, b = 153.009282\n",
      "epoch  106: loss = 2306477.577040, a = 183.564841, b = 153.008304\n",
      "epoch  107: loss = 2304136.430888, a = 185.094297, b = 153.007327\n",
      "epoch  108: loss = 2301804.631543, a = 186.620695, b = 153.006352\n",
      "epoch  109: loss = 2299482.141674, a = 188.144040, b = 153.005379\n",
      "epoch  110: loss = 2297168.924101, a = 189.664339, b = 153.004408\n",
      "epoch  111: loss = 2294864.941791, a = 191.181598, b = 153.003439\n",
      "epoch  112: loss = 2292570.157861, a = 192.695823, b = 153.002472\n",
      "epoch  113: loss = 2290284.535573, a = 194.207021, b = 153.001506\n",
      "epoch  114: loss = 2288008.038337, a = 195.715196, b = 153.000543\n",
      "epoch  115: loss = 2285740.629708, a = 197.220355, b = 152.999582\n",
      "epoch  116: loss = 2283482.273389, a = 198.722505, b = 152.998622\n",
      "epoch  117: loss = 2281232.933225, a = 200.221651, b = 152.997665\n",
      "epoch  118: loss = 2278992.573208, a = 201.717799, b = 152.996709\n",
      "epoch  119: loss = 2276761.157473, a = 203.210955, b = 152.995756\n",
      "epoch  120: loss = 2274538.650297, a = 204.701125, b = 152.994804\n",
      "epoch  121: loss = 2272325.016100, a = 206.188316, b = 152.993854\n",
      "epoch  122: loss = 2270120.219447, a = 207.672532, b = 152.992906\n",
      "epoch  123: loss = 2267924.225041, a = 209.153781, b = 152.991960\n",
      "epoch  124: loss = 2265736.997727, a = 210.632068, b = 152.991016\n",
      "epoch  125: loss = 2263558.502491, a = 212.107398, b = 152.990074\n",
      "epoch  126: loss = 2261388.704460, a = 213.579779, b = 152.989133\n",
      "epoch  127: loss = 2259227.568898, a = 215.049215, b = 152.988195\n",
      "epoch  128: loss = 2257075.061208, a = 216.515713, b = 152.987258\n",
      "epoch  129: loss = 2254931.146933, a = 217.979278, b = 152.986323\n",
      "epoch  130: loss = 2252795.791751, a = 219.439916, b = 152.985390\n",
      "epoch  131: loss = 2250668.961481, a = 220.897634, b = 152.984459\n",
      "epoch  132: loss = 2248550.622075, a = 222.352437, b = 152.983530\n",
      "epoch  133: loss = 2246440.739622, a = 223.804331, b = 152.982603\n",
      "epoch  134: loss = 2244339.280347, a = 225.253321, b = 152.981677\n",
      "epoch  135: loss = 2242246.210609, a = 226.699414, b = 152.980754\n",
      "epoch  136: loss = 2240161.496903, a = 228.142616, b = 152.979832\n",
      "epoch  137: loss = 2238085.105855, a = 229.582931, b = 152.978912\n",
      "epoch  138: loss = 2236017.004229, a = 231.020366, b = 152.977994\n",
      "epoch  139: loss = 2233957.158916, a = 232.454927, b = 152.977078\n",
      "epoch  140: loss = 2231905.536944, a = 233.886619, b = 152.976163\n",
      "epoch  141: loss = 2229862.105469, a = 235.315448, b = 152.975251\n",
      "epoch  142: loss = 2227826.831783, a = 236.741420, b = 152.974340\n",
      "epoch  143: loss = 2225799.683303, a = 238.164541, b = 152.973431\n",
      "epoch  144: loss = 2223780.627579, a = 239.584815, b = 152.972524\n",
      "epoch  145: loss = 2221769.632292, a = 241.002250, b = 152.971619\n",
      "epoch  146: loss = 2219766.665250, a = 242.416850, b = 152.970715\n",
      "epoch  147: loss = 2217771.694390, a = 243.828622, b = 152.969813\n",
      "epoch  148: loss = 2215784.687776, a = 245.237570, b = 152.968913\n",
      "epoch  149: loss = 2213805.613603, a = 246.643701, b = 152.968015\n",
      "epoch  150: loss = 2211834.440190, a = 248.047021, b = 152.967119\n",
      "epoch  151: loss = 2209871.135983, a = 249.447534, b = 152.966225\n",
      "epoch  152: loss = 2207915.669555, a = 250.845246, b = 152.965332\n",
      "epoch  153: loss = 2205968.009603, a = 252.240164, b = 152.964441\n",
      "epoch  154: loss = 2204028.124951, a = 253.632292, b = 152.963552\n",
      "epoch  155: loss = 2202095.984547, a = 255.021636, b = 152.962664\n",
      "epoch  156: loss = 2200171.557461, a = 256.408203, b = 152.961779\n",
      "epoch  157: loss = 2198254.812889, a = 257.791996, b = 152.960895\n",
      "epoch  158: loss = 2196345.720150, a = 259.173022, b = 152.960013\n",
      "epoch  159: loss = 2194444.248684, a = 260.551287, b = 152.959133\n",
      "epoch  160: loss = 2192550.368053, a = 261.926796, b = 152.958254\n",
      "epoch  161: loss = 2190664.047943, a = 263.299554, b = 152.957377\n",
      "epoch  162: loss = 2188785.258158, a = 264.669567, b = 152.956502\n",
      "epoch  163: loss = 2186913.968625, a = 266.036841, b = 152.955629\n",
      "epoch  164: loss = 2185050.149391, a = 267.401380, b = 152.954757\n",
      "epoch  165: loss = 2183193.770620, a = 268.763191, b = 152.953888\n",
      "epoch  166: loss = 2181344.802598, a = 270.122278, b = 152.953020\n",
      "epoch  167: loss = 2179503.215730, a = 271.478648, b = 152.952153\n",
      "epoch  168: loss = 2177668.980536, a = 272.832306, b = 152.951289\n",
      "epoch  169: loss = 2175842.067656, a = 274.183256, b = 152.950426\n",
      "epoch  170: loss = 2174022.447849, a = 275.531506, b = 152.949565\n",
      "epoch  171: loss = 2172210.091986, a = 276.877059, b = 152.948705\n",
      "epoch  172: loss = 2170404.971060, a = 278.219921, b = 152.947848\n",
      "epoch  173: loss = 2168607.056175, a = 279.560099, b = 152.946992\n",
      "epoch  174: loss = 2166816.318553, a = 280.897596, b = 152.946138\n",
      "epoch  175: loss = 2165032.729530, a = 282.232419, b = 152.945285\n",
      "epoch  176: loss = 2163256.260558, a = 283.564572, b = 152.944434\n",
      "epoch  177: loss = 2161486.883202, a = 284.894062, b = 152.943585\n",
      "epoch  178: loss = 2159724.569140, a = 286.220893, b = 152.942738\n",
      "epoch  179: loss = 2157969.290163, a = 287.545071, b = 152.941892\n",
      "epoch  180: loss = 2156221.018176, a = 288.866601, b = 152.941048\n",
      "epoch  181: loss = 2154479.725196, a = 290.185489, b = 152.940205\n",
      "epoch  182: loss = 2152745.383351, a = 291.501739, b = 152.939365\n",
      "epoch  183: loss = 2151017.964881, a = 292.815357, b = 152.938526\n",
      "epoch  184: loss = 2149297.442136, a = 294.126348, b = 152.937688\n",
      "epoch  185: loss = 2147583.787577, a = 295.434718, b = 152.936853\n",
      "epoch  186: loss = 2145876.973776, a = 296.740471, b = 152.936019\n",
      "epoch  187: loss = 2144176.973412, a = 298.043614, b = 152.935186\n",
      "epoch  188: loss = 2142483.759277, a = 299.344150, b = 152.934356\n",
      "epoch  189: loss = 2140797.304267, a = 300.642086, b = 152.933527\n",
      "epoch  190: loss = 2139117.581390, a = 301.937426, b = 152.932699\n",
      "epoch  191: loss = 2137444.563760, a = 303.230176, b = 152.931874\n",
      "epoch  192: loss = 2135778.224600, a = 304.520341, b = 152.931050\n",
      "epoch  193: loss = 2134118.537237, a = 305.807926, b = 152.930227\n",
      "epoch  194: loss = 2132465.475108, a = 307.092937, b = 152.929407\n",
      "epoch  195: loss = 2130819.011754, a = 308.375378, b = 152.928588\n",
      "epoch  196: loss = 2129179.120822, a = 309.655254, b = 152.927770\n",
      "epoch  197: loss = 2127545.776064, a = 310.932571, b = 152.926954\n",
      "epoch  198: loss = 2125918.951339, a = 312.207334, b = 152.926140\n",
      "epoch  199: loss = 2124298.620607, a = 313.479547, b = 152.925328\n",
      "epoch  200: loss = 2122684.757934, a = 314.749217, b = 152.924517\n",
      "epoch  201: loss = 2121077.337490, a = 316.016348, b = 152.923707\n",
      "epoch  202: loss = 2119476.333547, a = 317.280945, b = 152.922900\n",
      "epoch  203: loss = 2117881.720480, a = 318.543013, b = 152.922094\n",
      "epoch  204: loss = 2116293.472768, a = 319.802557, b = 152.921289\n",
      "epoch  205: loss = 2114711.564989, a = 321.059583, b = 152.920486\n",
      "epoch  206: loss = 2113135.971825, a = 322.314095, b = 152.919685\n",
      "epoch  207: loss = 2111566.668058, a = 323.566099, b = 152.918885\n",
      "epoch  208: loss = 2110003.628571, a = 324.815599, b = 152.918087\n",
      "epoch  209: loss = 2108446.828347, a = 326.062600, b = 152.917291\n",
      "epoch  210: loss = 2106896.242470, a = 327.307108, b = 152.916496\n",
      "epoch  211: loss = 2105351.846122, a = 328.549127, b = 152.915703\n",
      "epoch  212: loss = 2103813.614585, a = 329.788662, b = 152.914911\n",
      "epoch  213: loss = 2102281.523241, a = 331.025719, b = 152.914121\n",
      "epoch  214: loss = 2100755.547567, a = 332.260302, b = 152.913332\n",
      "epoch  215: loss = 2099235.663141, a = 333.492417, b = 152.912545\n",
      "epoch  216: loss = 2097721.845637, a = 334.722067, b = 152.911760\n",
      "epoch  217: loss = 2096214.070828, a = 335.949259, b = 152.910976\n",
      "epoch  218: loss = 2094712.314580, a = 337.173997, b = 152.910194\n",
      "epoch  219: loss = 2093216.552860, a = 338.396285, b = 152.909413\n",
      "epoch  220: loss = 2091726.761728, a = 339.616130, b = 152.908634\n",
      "epoch  221: loss = 2090242.917340, a = 340.833535, b = 152.907857\n",
      "epoch  222: loss = 2088764.995948, a = 342.048506, b = 152.907081\n",
      "epoch  223: loss = 2087292.973899, a = 343.261047, b = 152.906306\n",
      "epoch  224: loss = 2085826.827634, a = 344.471164, b = 152.905533\n",
      "epoch  225: loss = 2084366.533687, a = 345.678860, b = 152.904762\n",
      "epoch  226: loss = 2082912.068689, a = 346.884142, b = 152.903992\n",
      "epoch  227: loss = 2081463.409360, a = 348.087014, b = 152.903224\n",
      "epoch  228: loss = 2080020.532516, a = 349.287480, b = 152.902457\n",
      "epoch  229: loss = 2078583.415065, a = 350.485545, b = 152.901692\n",
      "epoch  230: loss = 2077152.034007, a = 351.681215, b = 152.900928\n",
      "epoch  231: loss = 2075726.366435, a = 352.874494, b = 152.900166\n",
      "epoch  232: loss = 2074306.389530, a = 354.065387, b = 152.899405\n",
      "epoch  233: loss = 2072892.080568, a = 355.253899, b = 152.898646\n",
      "epoch  234: loss = 2071483.416915, a = 356.440033, b = 152.897889\n",
      "epoch  235: loss = 2070080.376026, a = 357.623796, b = 152.897133\n",
      "epoch  236: loss = 2068682.935446, a = 358.805192, b = 152.896378\n",
      "epoch  237: loss = 2067291.072812, a = 359.984226, b = 152.895625\n",
      "epoch  238: loss = 2065904.765847, a = 361.160901, b = 152.894874\n",
      "epoch  239: loss = 2064523.992367, a = 362.335224, b = 152.894124\n",
      "epoch  240: loss = 2063148.730273, a = 363.507199, b = 152.893375\n",
      "epoch  241: loss = 2061778.957556, a = 364.676830, b = 152.892628\n",
      "epoch  242: loss = 2060414.652294, a = 365.844122, b = 152.891882\n",
      "epoch  243: loss = 2059055.792654, a = 367.009079, b = 152.891138\n",
      "epoch  244: loss = 2057702.356890, a = 368.171708, b = 152.890396\n",
      "epoch  245: loss = 2056354.323340, a = 369.332011, b = 152.889655\n",
      "epoch  246: loss = 2055011.670433, a = 370.489995, b = 152.888915\n",
      "epoch  247: loss = 2053674.376681, a = 371.645662, b = 152.888177\n",
      "epoch  248: loss = 2052342.420683, a = 372.799019, b = 152.887440\n",
      "epoch  249: loss = 2051015.781122, a = 373.950069, b = 152.886705\n",
      "epoch  250: loss = 2049694.436769, a = 375.098818, b = 152.885972\n",
      "epoch  251: loss = 2048378.366478, a = 376.245269, b = 152.885239\n",
      "epoch  252: loss = 2047067.549187, a = 377.389428, b = 152.884509\n",
      "epoch  253: loss = 2045761.963919, a = 378.531300, b = 152.883779\n",
      "epoch  254: loss = 2044461.589780, a = 379.670887, b = 152.883051\n",
      "epoch  255: loss = 2043166.405962, a = 380.808196, b = 152.882325\n",
      "epoch  256: loss = 2041876.391735, a = 381.943231, b = 152.881600\n",
      "epoch  257: loss = 2040591.526458, a = 383.075996, b = 152.880877\n",
      "epoch  258: loss = 2039311.789567, a = 384.206496, b = 152.880154\n",
      "epoch  259: loss = 2038037.160585, a = 385.334735, b = 152.879434\n",
      "epoch  260: loss = 2036767.619112, a = 386.460718, b = 152.878715\n",
      "epoch  261: loss = 2035503.144833, a = 387.584449, b = 152.877997\n",
      "epoch  262: loss = 2034243.717512, a = 388.705934, b = 152.877281\n",
      "epoch  263: loss = 2032989.316996, a = 389.825176, b = 152.876566\n",
      "epoch  264: loss = 2031739.923211, a = 390.942179, b = 152.875852\n",
      "epoch  265: loss = 2030495.516162, a = 392.056949, b = 152.875140\n",
      "epoch  266: loss = 2029256.075938, a = 393.169490, b = 152.874430\n",
      "epoch  267: loss = 2028021.582702, a = 394.279807, b = 152.873721\n",
      "epoch  268: loss = 2026792.016702, a = 395.387902, b = 152.873013\n",
      "epoch  269: loss = 2025567.358259, a = 396.493783, b = 152.872307\n",
      "epoch  270: loss = 2024347.587778, a = 397.597451, b = 152.871602\n",
      "epoch  271: loss = 2023132.685738, a = 398.698913, b = 152.870898\n",
      "epoch  272: loss = 2021922.632700, a = 399.798172, b = 152.870196\n",
      "epoch  273: loss = 2020717.409298, a = 400.895233, b = 152.869495\n",
      "epoch  274: loss = 2019516.996248, a = 401.990100, b = 152.868796\n",
      "epoch  275: loss = 2018321.374339, a = 403.082778, b = 152.868098\n",
      "epoch  276: loss = 2017130.524440, a = 404.173271, b = 152.867402\n",
      "epoch  277: loss = 2015944.427495, a = 405.261583, b = 152.866707\n",
      "epoch  278: loss = 2014763.064523, a = 406.347719, b = 152.866013\n",
      "epoch  279: loss = 2013586.416620, a = 407.431683, b = 152.865321\n",
      "epoch  280: loss = 2012414.464959, a = 408.513480, b = 152.864630\n",
      "epoch  281: loss = 2011247.190786, a = 409.593113, b = 152.863940\n",
      "epoch  282: loss = 2010084.575421, a = 410.670588, b = 152.863252\n",
      "epoch  283: loss = 2008926.600262, a = 411.745907, b = 152.862565\n",
      "epoch  284: loss = 2007773.246779, a = 412.819077, b = 152.861880\n",
      "epoch  285: loss = 2006624.496517, a = 413.890100, b = 152.861196\n",
      "epoch  286: loss = 2005480.331093, a = 414.958982, b = 152.860513\n",
      "epoch  287: loss = 2004340.732199, a = 416.025727, b = 152.859832\n",
      "epoch  288: loss = 2003205.681600, a = 417.090338, b = 152.859152\n",
      "epoch  289: loss = 2002075.161134, a = 418.152820, b = 152.858473\n",
      "epoch  290: loss = 2000949.152710, a = 419.213178, b = 152.857796\n",
      "epoch  291: loss = 1999827.638312, a = 420.271415, b = 152.857120\n",
      "epoch  292: loss = 1998710.599993, a = 421.327537, b = 152.856445\n",
      "epoch  293: loss = 1997598.019879, a = 422.381546, b = 152.855772\n",
      "epoch  294: loss = 1996489.880169, a = 423.433448, b = 152.855100\n",
      "epoch  295: loss = 1995386.163130, a = 424.483246, b = 152.854430\n",
      "epoch  296: loss = 1994286.851102, a = 425.530945, b = 152.853761\n",
      "epoch  297: loss = 1993191.926495, a = 426.576549, b = 152.853093\n",
      "epoch  298: loss = 1992101.371788, a = 427.620062, b = 152.852426\n",
      "epoch  299: loss = 1991015.169533, a = 428.661489, b = 152.851761\n",
      "epoch  300: loss = 1989933.302349, a = 429.700833, b = 152.851097\n",
      "epoch  301: loss = 1988855.752925, a = 430.738098, b = 152.850435\n",
      "epoch  302: loss = 1987782.504019, a = 431.773290, b = 152.849774\n",
      "epoch  303: loss = 1986713.538460, a = 432.806411, b = 152.849114\n",
      "epoch  304: loss = 1985648.839142, a = 433.837466, b = 152.848455\n",
      "epoch  305: loss = 1984588.389031, a = 434.866460, b = 152.847798\n",
      "epoch  306: loss = 1983532.171157, a = 435.893396, b = 152.847142\n",
      "epoch  307: loss = 1982480.168622, a = 436.918279, b = 152.846488\n",
      "epoch  308: loss = 1981432.364593, a = 437.941112, b = 152.845834\n",
      "epoch  309: loss = 1980388.742304, a = 438.961900, b = 152.845182\n",
      "epoch  310: loss = 1979349.285057, a = 439.980646, b = 152.844532\n",
      "epoch  311: loss = 1978313.976221, a = 440.997355, b = 152.843882\n",
      "epoch  312: loss = 1977282.799230, a = 442.012032, b = 152.843234\n",
      "epoch  313: loss = 1976255.737586, a = 443.024679, b = 152.842588\n",
      "epoch  314: loss = 1975232.774855, a = 444.035301, b = 152.841942\n",
      "epoch  315: loss = 1974213.894670, a = 445.043903, b = 152.841298\n",
      "epoch  316: loss = 1973199.080729, a = 446.050487, b = 152.840655\n",
      "epoch  317: loss = 1972188.316794, a = 447.055059, b = 152.840013\n",
      "epoch  318: loss = 1971181.586695, a = 448.057622, b = 152.839373\n",
      "epoch  319: loss = 1970178.874323, a = 449.058180, b = 152.838734\n",
      "epoch  320: loss = 1969180.163634, a = 450.056737, b = 152.838096\n",
      "epoch  321: loss = 1968185.438651, a = 451.053298, b = 152.837460\n",
      "epoch  322: loss = 1967194.683457, a = 452.047865, b = 152.836824\n",
      "epoch  323: loss = 1966207.882201, a = 453.040444, b = 152.836190\n",
      "epoch  324: loss = 1965225.019095, a = 454.031038, b = 152.835558\n",
      "epoch  325: loss = 1964246.078413, a = 455.019652, b = 152.834926\n",
      "epoch  326: loss = 1963271.044493, a = 456.006288, b = 152.834296\n",
      "epoch  327: loss = 1962299.901734, a = 456.990951, b = 152.833667\n",
      "epoch  328: loss = 1961332.634599, a = 457.973646, b = 152.833040\n",
      "epoch  329: loss = 1960369.227613, a = 458.954375, b = 152.832413\n",
      "epoch  330: loss = 1959409.665362, a = 459.933143, b = 152.831788\n",
      "epoch  331: loss = 1958453.932493, a = 460.909954, b = 152.831164\n",
      "epoch  332: loss = 1957502.013716, a = 461.884812, b = 152.830542\n",
      "epoch  333: loss = 1956553.893800, a = 462.857720, b = 152.829920\n",
      "epoch  334: loss = 1955609.557577, a = 463.828683, b = 152.829300\n",
      "epoch  335: loss = 1954668.989939, a = 464.797704, b = 152.828681\n",
      "epoch  336: loss = 1953732.175837, a = 465.764787, b = 152.828063\n",
      "epoch  337: loss = 1952799.100283, a = 466.729937, b = 152.827447\n",
      "epoch  338: loss = 1951869.748350, a = 467.693157, b = 152.826832\n",
      "epoch  339: loss = 1950944.105168, a = 468.654450, b = 152.826218\n",
      "epoch  340: loss = 1950022.155929, a = 469.613821, b = 152.825605\n",
      "epoch  341: loss = 1949103.885883, a = 470.571274, b = 152.824994\n",
      "epoch  342: loss = 1948189.280339, a = 471.526812, b = 152.824383\n",
      "epoch  343: loss = 1947278.324664, a = 472.480440, b = 152.823774\n",
      "epoch  344: loss = 1946371.004285, a = 473.432160, b = 152.823166\n",
      "epoch  345: loss = 1945467.304686, a = 474.381978, b = 152.822560\n",
      "epoch  346: loss = 1944567.211409, a = 475.329896, b = 152.821954\n",
      "epoch  347: loss = 1943670.710054, a = 476.275919, b = 152.821350\n",
      "epoch  348: loss = 1942777.786279, a = 477.220049, b = 152.820747\n",
      "epoch  349: loss = 1941888.425799, a = 478.162292, b = 152.820145\n",
      "epoch  350: loss = 1941002.614385, a = 479.102651, b = 152.819545\n",
      "epoch  351: loss = 1940120.337867, a = 480.041129, b = 152.818945\n",
      "epoch  352: loss = 1939241.582129, a = 480.977731, b = 152.818347\n",
      "epoch  353: loss = 1938366.333114, a = 481.912460, b = 152.817750\n",
      "epoch  354: loss = 1937494.576819, a = 482.845319, b = 152.817154\n",
      "epoch  355: loss = 1936626.299297, a = 483.776313, b = 152.816560\n",
      "epoch  356: loss = 1935761.486660, a = 484.705446, b = 152.815966\n",
      "epoch  357: loss = 1934900.125071, a = 485.632721, b = 152.815374\n",
      "epoch  358: loss = 1934042.200750, a = 486.558141, b = 152.814783\n",
      "epoch  359: loss = 1933187.699974, a = 487.481711, b = 152.814193\n",
      "epoch  360: loss = 1932336.609071, a = 488.403434, b = 152.813604\n",
      "epoch  361: loss = 1931488.914427, a = 489.323313, b = 152.813017\n",
      "epoch  362: loss = 1930644.602481, a = 490.241354, b = 152.812430\n",
      "epoch  363: loss = 1929803.659727, a = 491.157558, b = 152.811845\n",
      "epoch  364: loss = 1928966.072710, a = 492.071931, b = 152.811261\n",
      "epoch  365: loss = 1928131.828033, a = 492.984475, b = 152.810678\n",
      "epoch  366: loss = 1927300.912349, a = 493.895194, b = 152.810097\n",
      "epoch  367: loss = 1926473.312366, a = 494.804092, b = 152.809516\n",
      "epoch  368: loss = 1925649.014846, a = 495.711173, b = 152.808937\n",
      "epoch  369: loss = 1924828.006601, a = 496.616440, b = 152.808359\n",
      "epoch  370: loss = 1924010.274499, a = 497.519896, b = 152.807782\n",
      "epoch  371: loss = 1923195.805457, a = 498.421546, b = 152.807206\n",
      "epoch  372: loss = 1922384.586448, a = 499.321393, b = 152.806631\n",
      "epoch  373: loss = 1921576.604494, a = 500.219440, b = 152.806057\n",
      "epoch  374: loss = 1920771.846670, a = 501.115692, b = 152.805485\n",
      "epoch  375: loss = 1919970.300103, a = 502.010152, b = 152.804914\n",
      "epoch  376: loss = 1919171.951971, a = 502.902823, b = 152.804344\n",
      "epoch  377: loss = 1918376.789502, a = 503.793708, b = 152.803775\n",
      "epoch  378: loss = 1917584.799978, a = 504.682813, b = 152.803207\n",
      "epoch  379: loss = 1916795.970729, a = 505.570139, b = 152.802640\n",
      "epoch  380: loss = 1916010.289136, a = 506.455691, b = 152.802074\n",
      "epoch  381: loss = 1915227.742632, a = 507.339473, b = 152.801510\n",
      "epoch  382: loss = 1914448.318700, a = 508.221487, b = 152.800947\n",
      "epoch  383: loss = 1913672.004870, a = 509.101737, b = 152.800384\n",
      "epoch  384: loss = 1912898.788726, a = 509.980227, b = 152.799823\n",
      "epoch  385: loss = 1912128.657898, a = 510.856960, b = 152.799263\n",
      "epoch  386: loss = 1911361.600068, a = 511.731940, b = 152.798704\n",
      "epoch  387: loss = 1910597.602966, a = 512.605171, b = 152.798147\n",
      "epoch  388: loss = 1909836.654372, a = 513.476655, b = 152.797590\n",
      "epoch  389: loss = 1909078.742112, a = 514.346397, b = 152.797035\n",
      "epoch  390: loss = 1908323.854064, a = 515.214399, b = 152.796480\n",
      "epoch  391: loss = 1907571.978154, a = 516.080666, b = 152.795927\n",
      "epoch  392: loss = 1906823.102353, a = 516.945201, b = 152.795375\n",
      "epoch  393: loss = 1906077.214684, a = 517.808006, b = 152.794824\n",
      "epoch  394: loss = 1905334.303215, a = 518.669087, b = 152.794274\n",
      "epoch  395: loss = 1904594.356064, a = 519.528445, b = 152.793725\n",
      "epoch  396: loss = 1903857.361395, a = 520.386085, b = 152.793177\n",
      "epoch  397: loss = 1903123.307419, a = 521.242011, b = 152.792630\n",
      "epoch  398: loss = 1902392.182395, a = 522.096224, b = 152.792085\n",
      "epoch  399: loss = 1901663.974628, a = 522.948729, b = 152.791540\n",
      "epoch  400: loss = 1900938.672471, a = 523.799530, b = 152.790997\n",
      "epoch  401: loss = 1900216.264323, a = 524.648629, b = 152.790455\n",
      "epoch  402: loss = 1899496.738628, a = 525.496031, b = 152.789913\n",
      "epoch  403: loss = 1898780.083878, a = 526.341738, b = 152.789373\n",
      "epoch  404: loss = 1898066.288609, a = 527.185753, b = 152.788834\n",
      "epoch  405: loss = 1897355.341406, a = 528.028081, b = 152.788296\n",
      "epoch  406: loss = 1896647.230897, a = 528.868725, b = 152.787759\n",
      "epoch  407: loss = 1895941.945754, a = 529.707688, b = 152.787223\n",
      "epoch  408: loss = 1895239.474699, a = 530.544973, b = 152.786689\n",
      "epoch  409: loss = 1894539.806495, a = 531.380583, b = 152.786155\n",
      "epoch  410: loss = 1893842.929951, a = 532.214523, b = 152.785622\n",
      "epoch  411: loss = 1893148.833922, a = 533.046795, b = 152.785091\n",
      "epoch  412: loss = 1892457.507305, a = 533.877403, b = 152.784560\n",
      "epoch  413: loss = 1891768.939043, a = 534.706350, b = 152.784031\n",
      "epoch  414: loss = 1891083.118123, a = 535.533639, b = 152.783502\n",
      "epoch  415: loss = 1890400.033577, a = 536.359274, b = 152.782975\n",
      "epoch  416: loss = 1889719.674478, a = 537.183258, b = 152.782449\n",
      "epoch  417: loss = 1889042.029945, a = 538.005595, b = 152.781924\n",
      "epoch  418: loss = 1888367.089140, a = 538.826287, b = 152.781399\n",
      "epoch  419: loss = 1887694.841269, a = 539.645337, b = 152.780876\n",
      "epoch  420: loss = 1887025.275578, a = 540.462750, b = 152.780354\n",
      "epoch  421: loss = 1886358.381359, a = 541.278529, b = 152.779833\n",
      "epoch  422: loss = 1885694.147947, a = 542.092676, b = 152.779313\n",
      "epoch  423: loss = 1885032.564717, a = 542.905195, b = 152.778794\n",
      "epoch  424: loss = 1884373.621089, a = 543.716089, b = 152.778276\n",
      "epoch  425: loss = 1883717.306523, a = 544.525362, b = 152.777759\n",
      "epoch  426: loss = 1883063.610524, a = 545.333017, b = 152.777244\n",
      "epoch  427: loss = 1882412.522636, a = 546.139056, b = 152.776729\n",
      "epoch  428: loss = 1881764.032446, a = 546.943484, b = 152.776215\n",
      "epoch  429: loss = 1881118.129583, a = 547.746303, b = 152.775702\n",
      "epoch  430: loss = 1880474.803717, a = 548.547517, b = 152.775190\n",
      "epoch  431: loss = 1879834.044558, a = 549.347128, b = 152.774680\n",
      "epoch  432: loss = 1879195.841860, a = 550.145141, b = 152.774170\n",
      "epoch  433: loss = 1878560.185416, a = 550.941558, b = 152.773661\n",
      "epoch  434: loss = 1877927.065059, a = 551.736382, b = 152.773154\n",
      "epoch  435: loss = 1877296.470664, a = 552.529617, b = 152.772647\n",
      "epoch  436: loss = 1876668.392146, a = 553.321265, b = 152.772141\n",
      "epoch  437: loss = 1876042.819461, a = 554.111331, b = 152.771637\n",
      "epoch  438: loss = 1875419.742604, a = 554.899817, b = 152.771133\n",
      "epoch  439: loss = 1874799.151611, a = 555.686726, b = 152.770631\n",
      "epoch  440: loss = 1874181.036556, a = 556.472061, b = 152.770129\n",
      "epoch  441: loss = 1873565.387555, a = 557.255826, b = 152.769629\n",
      "epoch  442: loss = 1872952.194761, a = 558.038024, b = 152.769129\n",
      "epoch  443: loss = 1872341.448369, a = 558.818658, b = 152.768630\n",
      "epoch  444: loss = 1871733.138612, a = 559.597731, b = 152.768133\n",
      "epoch  445: loss = 1871127.255760, a = 560.375245, b = 152.767636\n",
      "epoch  446: loss = 1870523.790126, a = 561.151205, b = 152.767141\n",
      "epoch  447: loss = 1869922.732057, a = 561.925614, b = 152.766646\n",
      "epoch  448: loss = 1869324.071943, a = 562.698474, b = 152.766152\n",
      "epoch  449: loss = 1868727.800209, a = 563.469788, b = 152.765660\n",
      "epoch  450: loss = 1868133.907320, a = 564.239560, b = 152.765168\n",
      "epoch  451: loss = 1867542.383779, a = 565.007792, b = 152.764677\n",
      "epoch  452: loss = 1866953.220126, a = 565.774489, b = 152.764188\n",
      "epoch  453: loss = 1866366.406939, a = 566.539652, b = 152.763699\n",
      "epoch  454: loss = 1865781.934835, a = 567.303285, b = 152.763211\n",
      "epoch  455: loss = 1865199.794467, a = 568.065392, b = 152.762724\n",
      "epoch  456: loss = 1864619.976525, a = 568.825974, b = 152.762239\n",
      "epoch  457: loss = 1864042.471739, a = 569.585035, b = 152.761754\n",
      "epoch  458: loss = 1863467.270872, a = 570.342579, b = 152.761270\n",
      "epoch  459: loss = 1862894.364726, a = 571.098607, b = 152.760787\n",
      "epoch  460: loss = 1862323.744141, a = 571.853124, b = 152.760305\n",
      "epoch  461: loss = 1861755.399991, a = 572.606132, b = 152.759824\n",
      "epoch  462: loss = 1861189.323188, a = 573.357635, b = 152.759344\n",
      "epoch  463: loss = 1860625.504680, a = 574.107634, b = 152.758865\n",
      "epoch  464: loss = 1860063.935451, a = 574.856134, b = 152.758387\n",
      "epoch  465: loss = 1859504.606521, a = 575.603137, b = 152.757910\n",
      "epoch  466: loss = 1858947.508946, a = 576.348646, b = 152.757434\n",
      "epoch  467: loss = 1858392.633818, a = 577.092665, b = 152.756959\n",
      "epoch  468: loss = 1857839.972264, a = 577.835195, b = 152.756485\n",
      "epoch  469: loss = 1857289.515447, a = 578.576241, b = 152.756011\n",
      "epoch  470: loss = 1856741.254564, a = 579.315805, b = 152.755539\n",
      "epoch  471: loss = 1856195.180850, a = 580.053891, b = 152.755067\n",
      "epoch  472: loss = 1855651.285571, a = 580.790500, b = 152.754597\n",
      "epoch  473: loss = 1855109.560032, a = 581.525636, b = 152.754127\n",
      "epoch  474: loss = 1854569.995569, a = 582.259302, b = 152.753659\n",
      "epoch  475: loss = 1854032.583556, a = 582.991501, b = 152.753191\n",
      "epoch  476: loss = 1853497.315398, a = 583.722236, b = 152.752725\n",
      "epoch  477: loss = 1852964.182538, a = 584.451510, b = 152.752259\n",
      "epoch  478: loss = 1852433.176450, a = 585.179326, b = 152.751794\n",
      "epoch  479: loss = 1851904.288645, a = 585.905686, b = 152.751330\n",
      "epoch  480: loss = 1851377.510664, a = 586.630593, b = 152.750867\n",
      "epoch  481: loss = 1850852.834086, a = 587.354051, b = 152.750405\n",
      "epoch  482: loss = 1850330.250520, a = 588.076063, b = 152.749944\n",
      "epoch  483: loss = 1849809.751612, a = 588.796630, b = 152.749484\n",
      "epoch  484: loss = 1849291.329038, a = 589.515757, b = 152.749024\n",
      "epoch  485: loss = 1848774.974510, a = 590.233445, b = 152.748566\n",
      "epoch  486: loss = 1848260.679771, a = 590.949699, b = 152.748108\n",
      "epoch  487: loss = 1847748.436598, a = 591.664520, b = 152.747652\n",
      "epoch  488: loss = 1847238.236802, a = 592.377912, b = 152.747196\n",
      "epoch  489: loss = 1846730.072224, a = 593.089877, b = 152.746741\n",
      "epoch  490: loss = 1846223.934739, a = 593.800419, b = 152.746288\n",
      "epoch  491: loss = 1845719.816255, a = 594.509540, b = 152.745835\n",
      "epoch  492: loss = 1845217.708712, a = 595.217242, b = 152.745383\n",
      "epoch  493: loss = 1844717.604082, a = 595.923530, b = 152.744932\n",
      "epoch  494: loss = 1844219.494368, a = 596.628405, b = 152.744481\n",
      "epoch  495: loss = 1843723.371607, a = 597.331871, b = 152.744032\n",
      "epoch  496: loss = 1843229.227867, a = 598.033930, b = 152.743584\n",
      "epoch  497: loss = 1842737.055246, a = 598.734585, b = 152.743136\n",
      "epoch  498: loss = 1842246.845876, a = 599.433839, b = 152.742690\n",
      "epoch  499: loss = 1841758.591920, a = 600.131695, b = 152.742244\n",
      "epoch  500: loss = 1841272.285571, a = 600.828155, b = 152.741799\n",
      "epoch  501: loss = 1840787.919054, a = 601.523222, b = 152.741355\n",
      "epoch  502: loss = 1840305.484625, a = 602.216900, b = 152.740912\n",
      "epoch  503: loss = 1839824.974571, a = 602.909191, b = 152.740470\n",
      "epoch  504: loss = 1839346.381209, a = 603.600097, b = 152.740029\n",
      "epoch  505: loss = 1838869.696888, a = 604.289621, b = 152.739588\n",
      "epoch  506: loss = 1838394.913987, a = 604.977767, b = 152.739149\n",
      "epoch  507: loss = 1837922.024916, a = 605.664537, b = 152.738710\n",
      "epoch  508: loss = 1837451.022113, a = 606.349933, b = 152.738272\n",
      "epoch  509: loss = 1836981.898050, a = 607.033959, b = 152.737835\n",
      "epoch  510: loss = 1836514.645225, a = 607.716617, b = 152.737399\n",
      "epoch  511: loss = 1836049.256168, a = 608.397910, b = 152.736964\n",
      "epoch  512: loss = 1835585.723441, a = 609.077841, b = 152.736530\n",
      "epoch  513: loss = 1835124.039631, a = 609.756412, b = 152.736097\n",
      "epoch  514: loss = 1834664.197358, a = 610.433626, b = 152.735664\n",
      "epoch  515: loss = 1834206.189270, a = 611.109486, b = 152.735232\n",
      "epoch  516: loss = 1833750.008046, a = 611.783994, b = 152.734802\n",
      "epoch  517: loss = 1833295.646392, a = 612.457153, b = 152.734372\n",
      "epoch  518: loss = 1832843.097045, a = 613.128967, b = 152.733943\n",
      "epoch  519: loss = 1832392.352771, a = 613.799437, b = 152.733514\n",
      "epoch  520: loss = 1831943.406362, a = 614.468566, b = 152.733087\n",
      "epoch  521: loss = 1831496.250642, a = 615.136357, b = 152.732660\n",
      "epoch  522: loss = 1831050.878463, a = 615.802813, b = 152.732235\n",
      "epoch  523: loss = 1830607.282705, a = 616.467937, b = 152.731810\n",
      "epoch  524: loss = 1830165.456276, a = 617.131730, b = 152.731386\n",
      "epoch  525: loss = 1829725.392114, a = 617.794196, b = 152.730963\n",
      "epoch  526: loss = 1829287.083183, a = 618.455337, b = 152.730541\n",
      "epoch  527: loss = 1828850.522477, a = 619.115156, b = 152.730119\n",
      "epoch  528: loss = 1828415.703016, a = 619.773655, b = 152.729699\n",
      "epoch  529: loss = 1827982.617850, a = 620.430838, b = 152.729279\n",
      "epoch  530: loss = 1827551.260056, a = 621.086707, b = 152.728860\n",
      "epoch  531: loss = 1827121.622739, a = 621.741264, b = 152.728442\n",
      "epoch  532: loss = 1826693.699029, a = 622.394512, b = 152.728025\n",
      "epoch  533: loss = 1826267.482087, a = 623.046454, b = 152.727608\n",
      "epoch  534: loss = 1825842.965099, a = 623.697093, b = 152.727193\n",
      "epoch  535: loss = 1825420.141279, a = 624.346430, b = 152.726778\n",
      "epoch  536: loss = 1824999.003869, a = 624.994469, b = 152.726364\n",
      "epoch  537: loss = 1824579.546136, a = 625.641212, b = 152.725951\n",
      "epoch  538: loss = 1824161.761376, a = 626.286662, b = 152.725539\n",
      "epoch  539: loss = 1823745.642910, a = 626.930821, b = 152.725127\n",
      "epoch  540: loss = 1823331.184086, a = 627.573691, b = 152.724717\n",
      "epoch  541: loss = 1822918.378279, a = 628.215277, b = 152.724307\n",
      "epoch  542: loss = 1822507.218891, a = 628.855579, b = 152.723898\n",
      "epoch  543: loss = 1822097.699350, a = 629.494601, b = 152.723490\n",
      "epoch  544: loss = 1821689.813109, a = 630.132345, b = 152.723083\n",
      "epoch  545: loss = 1821283.553649, a = 630.768814, b = 152.722676\n",
      "epoch  546: loss = 1820878.914476, a = 631.404010, b = 152.722270\n",
      "epoch  547: loss = 1820475.889122, a = 632.037936, b = 152.721865\n",
      "epoch  548: loss = 1820074.471145, a = 632.670595, b = 152.721461\n",
      "epoch  549: loss = 1819674.654128, a = 633.301988, b = 152.721058\n",
      "epoch  550: loss = 1819276.431682, a = 633.932119, b = 152.720656\n",
      "epoch  551: loss = 1818879.797440, a = 634.560989, b = 152.720254\n",
      "epoch  552: loss = 1818484.745063, a = 635.188602, b = 152.719853\n",
      "epoch  553: loss = 1818091.268237, a = 635.814960, b = 152.719453\n",
      "epoch  554: loss = 1817699.360671, a = 636.440066, b = 152.719054\n",
      "epoch  555: loss = 1817309.016104, a = 637.063922, b = 152.718655\n",
      "epoch  556: loss = 1816920.228294, a = 637.686530, b = 152.718258\n",
      "epoch  557: loss = 1816532.991028, a = 638.307893, b = 152.717861\n",
      "epoch  558: loss = 1816147.298117, a = 638.928013, b = 152.717465\n",
      "epoch  559: loss = 1815763.143396, a = 639.546894, b = 152.717070\n",
      "epoch  560: loss = 1815380.520724, a = 640.164537, b = 152.716675\n",
      "epoch  561: loss = 1814999.423987, a = 640.780944, b = 152.716281\n",
      "epoch  562: loss = 1814619.847094, a = 641.396120, b = 152.715888\n",
      "epoch  563: loss = 1814241.783977, a = 642.010065, b = 152.715496\n",
      "epoch  564: loss = 1813865.228594, a = 642.622782, b = 152.715105\n",
      "epoch  565: loss = 1813490.174926, a = 643.234274, b = 152.714714\n",
      "epoch  566: loss = 1813116.616980, a = 643.844544, b = 152.714325\n",
      "epoch  567: loss = 1812744.548785, a = 644.453593, b = 152.713936\n",
      "epoch  568: loss = 1812373.964394, a = 645.061424, b = 152.713547\n",
      "epoch  569: loss = 1812004.857885, a = 645.668039, b = 152.713160\n",
      "epoch  570: loss = 1811637.223358, a = 646.273442, b = 152.712773\n",
      "epoch  571: loss = 1811271.054937, a = 646.877634, b = 152.712387\n",
      "epoch  572: loss = 1810906.346771, a = 647.480618, b = 152.712002\n",
      "epoch  573: loss = 1810543.093031, a = 648.082396, b = 152.711618\n",
      "epoch  574: loss = 1810181.287911, a = 648.682971, b = 152.711234\n",
      "epoch  575: loss = 1809820.925628, a = 649.282345, b = 152.710852\n",
      "epoch  576: loss = 1809462.000425, a = 649.880520, b = 152.710469\n",
      "epoch  577: loss = 1809104.506563, a = 650.477499, b = 152.710088\n",
      "epoch  578: loss = 1808748.438331, a = 651.073284, b = 152.709708\n",
      "epoch  579: loss = 1808393.790037, a = 651.667878, b = 152.709328\n",
      "epoch  580: loss = 1808040.556015, a = 652.261283, b = 152.708949\n",
      "epoch  581: loss = 1807688.730617, a = 652.853502, b = 152.708571\n",
      "epoch  582: loss = 1807338.308223, a = 653.444536, b = 152.708193\n",
      "epoch  583: loss = 1806989.283232, a = 654.034388, b = 152.707816\n",
      "epoch  584: loss = 1806641.650065, a = 654.623061, b = 152.707440\n",
      "epoch  585: loss = 1806295.403168, a = 655.210556, b = 152.707065\n",
      "epoch  586: loss = 1805950.537008, a = 655.796877, b = 152.706691\n",
      "epoch  587: loss = 1805607.046072, a = 656.382025, b = 152.706317\n",
      "epoch  588: loss = 1805264.924872, a = 656.966004, b = 152.705944\n",
      "epoch  589: loss = 1804924.167940, a = 657.548814, b = 152.705572\n",
      "epoch  590: loss = 1804584.769832, a = 658.130459, b = 152.705200\n",
      "epoch  591: loss = 1804246.725122, a = 658.710941, b = 152.704829\n",
      "epoch  592: loss = 1803910.028410, a = 659.290262, b = 152.704459\n",
      "epoch  593: loss = 1803574.674315, a = 659.868425, b = 152.704090\n",
      "epoch  594: loss = 1803240.657477, a = 660.445432, b = 152.703722\n",
      "epoch  595: loss = 1802907.972559, a = 661.021284, b = 152.703354\n",
      "epoch  596: loss = 1802576.614245, a = 661.595986, b = 152.702987\n",
      "epoch  597: loss = 1802246.577240, a = 662.169538, b = 152.702620\n",
      "epoch  598: loss = 1801917.856269, a = 662.741943, b = 152.702255\n",
      "epoch  599: loss = 1801590.446081, a = 663.313203, b = 152.701890\n",
      "epoch  600: loss = 1801264.341442, a = 663.883321, b = 152.701526\n",
      "epoch  601: loss = 1800939.537143, a = 664.452299, b = 152.701163\n",
      "epoch  602: loss = 1800616.027992, a = 665.020140, b = 152.700800\n",
      "epoch  603: loss = 1800293.808821, a = 665.586845, b = 152.700438\n",
      "epoch  604: loss = 1799972.874480, a = 666.152416, b = 152.700077\n",
      "epoch  605: loss = 1799653.219842, a = 666.716857, b = 152.699716\n",
      "epoch  606: loss = 1799334.839799, a = 667.280169, b = 152.699356\n",
      "epoch  607: loss = 1799017.729262, a = 667.842355, b = 152.698997\n",
      "epoch  608: loss = 1798701.883166, a = 668.403416, b = 152.698639\n",
      "epoch  609: loss = 1798387.296463, a = 668.963355, b = 152.698281\n",
      "epoch  610: loss = 1798073.964127, a = 669.522175, b = 152.697924\n",
      "epoch  611: loss = 1797761.881151, a = 670.079877, b = 152.697568\n",
      "epoch  612: loss = 1797451.042549, a = 670.636464, b = 152.697213\n",
      "epoch  613: loss = 1797141.443353, a = 671.191938, b = 152.696858\n",
      "epoch  614: loss = 1796833.078618, a = 671.746302, b = 152.696504\n",
      "epoch  615: loss = 1796525.943415, a = 672.299557, b = 152.696150\n",
      "epoch  616: loss = 1796220.032837, a = 672.851705, b = 152.695798\n",
      "epoch  617: loss = 1795915.341998, a = 673.402749, b = 152.695446\n",
      "epoch  618: loss = 1795611.866027, a = 673.952692, b = 152.695095\n",
      "epoch  619: loss = 1795309.600077, a = 674.501534, b = 152.694744\n",
      "epoch  620: loss = 1795008.539318, a = 675.049280, b = 152.694394\n",
      "epoch  621: loss = 1794708.678940, a = 675.595930, b = 152.694045\n",
      "epoch  622: loss = 1794410.014151, a = 676.141486, b = 152.693697\n",
      "epoch  623: loss = 1794112.540180, a = 676.685952, b = 152.693349\n",
      "epoch  624: loss = 1793816.252274, a = 677.229329, b = 152.693002\n",
      "epoch  625: loss = 1793521.145700, a = 677.771620, b = 152.692656\n",
      "epoch  626: loss = 1793227.215741, a = 678.312826, b = 152.692310\n",
      "epoch  627: loss = 1792934.457703, a = 678.852950, b = 152.691965\n",
      "epoch  628: loss = 1792642.866907, a = 679.391994, b = 152.691621\n",
      "epoch  629: loss = 1792352.438696, a = 679.929959, b = 152.691277\n",
      "epoch  630: loss = 1792063.168428, a = 680.466850, b = 152.690934\n",
      "epoch  631: loss = 1791775.051483, a = 681.002666, b = 152.690592\n",
      "epoch  632: loss = 1791488.083257, a = 681.537411, b = 152.690250\n",
      "epoch  633: loss = 1791202.259166, a = 682.071087, b = 152.689909\n",
      "epoch  634: loss = 1790917.574643, a = 682.603696, b = 152.689569\n",
      "epoch  635: loss = 1790634.025140, a = 683.135239, b = 152.689230\n",
      "epoch  636: loss = 1790351.606127, a = 683.665720, b = 152.688891\n",
      "epoch  637: loss = 1790070.313092, a = 684.195140, b = 152.688553\n",
      "epoch  638: loss = 1789790.141542, a = 684.723501, b = 152.688215\n",
      "epoch  639: loss = 1789511.087000, a = 685.250806, b = 152.687879\n",
      "epoch  640: loss = 1789233.145008, a = 685.777056, b = 152.687542\n",
      "epoch  641: loss = 1788956.311125, a = 686.302254, b = 152.687207\n",
      "epoch  642: loss = 1788680.580931, a = 686.826401, b = 152.686872\n",
      "epoch  643: loss = 1788405.950018, a = 687.349501, b = 152.686538\n",
      "epoch  644: loss = 1788132.414001, a = 687.871555, b = 152.686205\n",
      "epoch  645: loss = 1787859.968509, a = 688.392564, b = 152.685872\n",
      "epoch  646: loss = 1787588.609190, a = 688.912532, b = 152.685540\n",
      "epoch  647: loss = 1787318.331709, a = 689.431460, b = 152.685208\n",
      "epoch  648: loss = 1787049.131749, a = 689.949350, b = 152.684878\n",
      "epoch  649: loss = 1786781.005009, a = 690.466205, b = 152.684548\n",
      "epoch  650: loss = 1786513.947206, a = 690.982026, b = 152.684218\n",
      "epoch  651: loss = 1786247.954073, a = 691.496816, b = 152.683889\n",
      "epoch  652: loss = 1785983.021362, a = 692.010576, b = 152.683561\n",
      "epoch  653: loss = 1785719.144840, a = 692.523309, b = 152.683234\n",
      "epoch  654: loss = 1785456.320293, a = 693.035016, b = 152.682907\n",
      "epoch  655: loss = 1785194.543521, a = 693.545701, b = 152.682581\n",
      "epoch  656: loss = 1784933.810344, a = 694.055364, b = 152.682255\n",
      "epoch  657: loss = 1784674.116596, a = 694.564008, b = 152.681930\n",
      "epoch  658: loss = 1784415.458129, a = 695.071635, b = 152.681606\n",
      "epoch  659: loss = 1784157.830811, a = 695.578247, b = 152.681282\n",
      "epoch  660: loss = 1783901.230528, a = 696.083846, b = 152.680960\n",
      "epoch  661: loss = 1783645.653179, a = 696.588433, b = 152.680637\n",
      "epoch  662: loss = 1783391.094684, a = 697.092012, b = 152.680316\n",
      "epoch  663: loss = 1783137.550975, a = 697.594584, b = 152.679995\n",
      "epoch  664: loss = 1782885.018003, a = 698.096150, b = 152.679674\n",
      "epoch  665: loss = 1782633.491734, a = 698.596714, b = 152.679355\n",
      "epoch  666: loss = 1782382.968150, a = 699.096277, b = 152.679036\n",
      "epoch  667: loss = 1782133.443251, a = 699.594841, b = 152.678717\n",
      "epoch  668: loss = 1781884.913049, a = 700.092408, b = 152.678399\n",
      "epoch  669: loss = 1781637.373576, a = 700.588980, b = 152.678082\n",
      "epoch  670: loss = 1781390.820878, a = 701.084559, b = 152.677766\n",
      "epoch  671: loss = 1781145.251017, a = 701.579147, b = 152.677450\n",
      "epoch  672: loss = 1780900.660070, a = 702.072746, b = 152.677134\n",
      "epoch  673: loss = 1780657.044131, a = 702.565358, b = 152.676820\n",
      "epoch  674: loss = 1780414.399308, a = 703.056984, b = 152.676506\n",
      "epoch  675: loss = 1780172.721727, a = 703.547628, b = 152.676192\n",
      "epoch  676: loss = 1779932.007527, a = 704.037291, b = 152.675880\n",
      "epoch  677: loss = 1779692.252863, a = 704.525974, b = 152.675568\n",
      "epoch  678: loss = 1779453.453906, a = 705.013681, b = 152.675256\n",
      "epoch  679: loss = 1779215.606843, a = 705.500412, b = 152.674945\n",
      "epoch  680: loss = 1778978.707874, a = 705.986169, b = 152.674635\n",
      "epoch  681: loss = 1778742.753217, a = 706.470956, b = 152.674325\n",
      "epoch  682: loss = 1778507.739101, a = 706.954773, b = 152.674016\n",
      "epoch  683: loss = 1778273.661775, a = 707.437622, b = 152.673708\n",
      "epoch  684: loss = 1778040.517499, a = 707.919506, b = 152.673400\n",
      "epoch  685: loss = 1777808.302550, a = 708.400426, b = 152.673093\n",
      "epoch  686: loss = 1777577.013219, a = 708.880385, b = 152.672786\n",
      "epoch  687: loss = 1777346.645813, a = 709.359384, b = 152.672481\n",
      "epoch  688: loss = 1777117.196652, a = 709.837425, b = 152.672175\n",
      "epoch  689: loss = 1776888.662073, a = 710.314510, b = 152.671870\n",
      "epoch  690: loss = 1776661.038424, a = 710.790641, b = 152.671566\n",
      "epoch  691: loss = 1776434.322072, a = 711.265820, b = 152.671263\n",
      "epoch  692: loss = 1776208.509395, a = 711.740049, b = 152.670960\n",
      "epoch  693: loss = 1775983.596787, a = 712.213329, b = 152.670658\n",
      "epoch  694: loss = 1775759.580657, a = 712.685664, b = 152.670356\n",
      "epoch  695: loss = 1775536.457426, a = 713.157053, b = 152.670055\n",
      "epoch  696: loss = 1775314.223532, a = 713.627500, b = 152.669754\n",
      "epoch  697: loss = 1775092.875426, a = 714.097006, b = 152.669455\n",
      "epoch  698: loss = 1774872.409572, a = 714.565574, b = 152.669155\n",
      "epoch  699: loss = 1774652.822451, a = 715.033204, b = 152.668857\n",
      "epoch  700: loss = 1774434.110556, a = 715.499899, b = 152.668559\n",
      "epoch  701: loss = 1774216.270393, a = 715.965661, b = 152.668261\n",
      "epoch  702: loss = 1773999.298484, a = 716.430492, b = 152.667964\n",
      "epoch  703: loss = 1773783.191366, a = 716.894393, b = 152.667668\n",
      "epoch  704: loss = 1773567.945585, a = 717.357367, b = 152.667372\n",
      "epoch  705: loss = 1773353.557706, a = 717.819415, b = 152.667077\n",
      "epoch  706: loss = 1773140.024305, a = 718.280538, b = 152.666783\n",
      "epoch  707: loss = 1772927.341972, a = 718.740740, b = 152.666489\n",
      "epoch  708: loss = 1772715.507311, a = 719.200021, b = 152.666195\n",
      "epoch  709: loss = 1772504.516939, a = 719.658384, b = 152.665903\n",
      "epoch  710: loss = 1772294.367487, a = 720.115831, b = 152.665610\n",
      "epoch  711: loss = 1772085.055600, a = 720.572363, b = 152.665319\n",
      "epoch  712: loss = 1771876.577936, a = 721.027981, b = 152.665028\n",
      "epoch  713: loss = 1771668.931165, a = 721.482689, b = 152.664737\n",
      "epoch  714: loss = 1771462.111971, a = 721.936488, b = 152.664448\n",
      "epoch  715: loss = 1771256.117053, a = 722.389379, b = 152.664158\n",
      "epoch  716: loss = 1771050.943122, a = 722.841364, b = 152.663870\n",
      "epoch  717: loss = 1770846.586900, a = 723.292446, b = 152.663582\n",
      "epoch  718: loss = 1770643.045126, a = 723.742625, b = 152.663294\n",
      "epoch  719: loss = 1770440.314550, a = 724.191904, b = 152.663007\n",
      "epoch  720: loss = 1770238.391933, a = 724.640285, b = 152.662721\n",
      "epoch  721: loss = 1770037.274053, a = 725.087770, b = 152.662435\n",
      "epoch  722: loss = 1769836.957698, a = 725.534359, b = 152.662150\n",
      "epoch  723: loss = 1769637.439670, a = 725.980056, b = 152.661865\n",
      "epoch  724: loss = 1769438.716783, a = 726.424861, b = 152.661581\n",
      "epoch  725: loss = 1769240.785864, a = 726.868776, b = 152.661297\n",
      "epoch  726: loss = 1769043.643754, a = 727.311805, b = 152.661014\n",
      "epoch  727: loss = 1768847.287304, a = 727.753947, b = 152.660732\n",
      "epoch  728: loss = 1768651.713380, a = 728.195205, b = 152.660450\n",
      "epoch  729: loss = 1768456.918858, a = 728.635580, b = 152.660169\n",
      "epoch  730: loss = 1768262.900630, a = 729.075075, b = 152.659888\n",
      "epoch  731: loss = 1768069.655598, a = 729.513692, b = 152.659608\n",
      "epoch  732: loss = 1767877.180675, a = 729.951431, b = 152.659328\n",
      "epoch  733: loss = 1767685.472790, a = 730.388294, b = 152.659049\n",
      "epoch  734: loss = 1767494.528882, a = 730.824285, b = 152.658771\n",
      "epoch  735: loss = 1767304.345902, a = 731.259403, b = 152.658493\n",
      "epoch  736: loss = 1767114.920814, a = 731.693651, b = 152.658216\n",
      "epoch  737: loss = 1766926.250593, a = 732.127031, b = 152.657939\n",
      "epoch  738: loss = 1766738.332229, a = 732.559544, b = 152.657663\n",
      "epoch  739: loss = 1766551.162720, a = 732.991193, b = 152.657387\n",
      "epoch  740: loss = 1766364.739080, a = 733.421978, b = 152.657112\n",
      "epoch  741: loss = 1766179.058330, a = 733.851902, b = 152.656837\n",
      "epoch  742: loss = 1765994.117509, a = 734.280966, b = 152.656563\n",
      "epoch  743: loss = 1765809.913662, a = 734.709172, b = 152.656290\n",
      "epoch  744: loss = 1765626.443849, a = 735.136522, b = 152.656017\n",
      "epoch  745: loss = 1765443.705143, a = 735.563017, b = 152.655744\n",
      "epoch  746: loss = 1765261.694624, a = 735.988660, b = 152.655472\n",
      "epoch  747: loss = 1765080.409388, a = 736.413451, b = 152.655201\n",
      "epoch  748: loss = 1764899.846541, a = 736.837393, b = 152.654930\n",
      "epoch  749: loss = 1764720.003201, a = 737.260487, b = 152.654660\n",
      "epoch  750: loss = 1764540.876496, a = 737.682735, b = 152.654390\n",
      "epoch  751: loss = 1764362.463568, a = 738.104139, b = 152.654121\n",
      "epoch  752: loss = 1764184.761567, a = 738.524700, b = 152.653853\n",
      "epoch  753: loss = 1764007.767659, a = 738.944420, b = 152.653585\n",
      "epoch  754: loss = 1763831.479016, a = 739.363301, b = 152.653317\n",
      "epoch  755: loss = 1763655.892826, a = 739.781344, b = 152.653050\n",
      "epoch  756: loss = 1763481.006286, a = 740.198551, b = 152.652784\n",
      "epoch  757: loss = 1763306.816603, a = 740.614924, b = 152.652518\n",
      "epoch  758: loss = 1763133.320998, a = 741.030464, b = 152.652252\n",
      "epoch  759: loss = 1762960.516702, a = 741.445174, b = 152.651987\n",
      "epoch  760: loss = 1762788.400955, a = 741.859054, b = 152.651723\n",
      "epoch  761: loss = 1762616.971010, a = 742.272106, b = 152.651459\n",
      "epoch  762: loss = 1762446.224132, a = 742.684333, b = 152.651196\n",
      "epoch  763: loss = 1762276.157595, a = 743.095735, b = 152.650933\n",
      "epoch  764: loss = 1762106.768685, a = 743.506314, b = 152.650671\n",
      "epoch  765: loss = 1761938.054697, a = 743.916073, b = 152.650409\n",
      "epoch  766: loss = 1761770.012940, a = 744.325012, b = 152.650148\n",
      "epoch  767: loss = 1761602.640730, a = 744.733133, b = 152.649887\n",
      "epoch  768: loss = 1761435.935396, a = 745.140439, b = 152.649627\n",
      "epoch  769: loss = 1761269.894279, a = 745.546929, b = 152.649368\n",
      "epoch  770: loss = 1761104.514727, a = 745.952607, b = 152.649109\n",
      "epoch  771: loss = 1760939.794101, a = 746.357474, b = 152.648850\n",
      "epoch  772: loss = 1760775.729772, a = 746.761531, b = 152.648592\n",
      "epoch  773: loss = 1760612.319122, a = 747.164780, b = 152.648334\n",
      "epoch  774: loss = 1760449.559542, a = 747.567223, b = 152.648077\n",
      "epoch  775: loss = 1760287.448435, a = 747.968861, b = 152.647821\n",
      "epoch  776: loss = 1760125.983214, a = 748.369696, b = 152.647565\n",
      "epoch  777: loss = 1759965.161302, a = 748.769729, b = 152.647309\n",
      "epoch  778: loss = 1759804.980131, a = 749.168963, b = 152.647054\n",
      "epoch  779: loss = 1759645.437147, a = 749.567398, b = 152.646800\n",
      "epoch  780: loss = 1759486.529802, a = 749.965036, b = 152.646546\n",
      "epoch  781: loss = 1759328.255560, a = 750.361879, b = 152.646292\n",
      "epoch  782: loss = 1759170.611896, a = 750.757929, b = 152.646039\n",
      "epoch  783: loss = 1759013.596294, a = 751.153187, b = 152.645787\n",
      "epoch  784: loss = 1758857.206248, a = 751.547654, b = 152.645535\n",
      "epoch  785: loss = 1758701.439262, a = 751.941332, b = 152.645284\n",
      "epoch  786: loss = 1758546.292851, a = 752.334224, b = 152.645033\n",
      "epoch  787: loss = 1758391.764538, a = 752.726329, b = 152.644782\n",
      "epoch  788: loss = 1758237.851858, a = 753.117651, b = 152.644532\n",
      "epoch  789: loss = 1758084.552355, a = 753.508190, b = 152.644283\n",
      "epoch  790: loss = 1757931.863581, a = 753.897948, b = 152.644034\n",
      "epoch  791: loss = 1757779.783102, a = 754.286926, b = 152.643785\n",
      "epoch  792: loss = 1757628.308489, a = 754.675127, b = 152.643538\n",
      "epoch  793: loss = 1757477.437325, a = 755.062552, b = 152.643290\n",
      "epoch  794: loss = 1757327.167204, a = 755.449202, b = 152.643043\n",
      "epoch  795: loss = 1757177.495727, a = 755.835078, b = 152.642797\n",
      "epoch  796: loss = 1757028.420505, a = 756.220183, b = 152.642551\n",
      "epoch  797: loss = 1756879.939161, a = 756.604518, b = 152.642305\n",
      "epoch  798: loss = 1756732.049325, a = 756.988085, b = 152.642060\n",
      "epoch  799: loss = 1756584.748637, a = 757.370884, b = 152.641816\n",
      "epoch  800: loss = 1756438.034746, a = 757.752918, b = 152.641572\n",
      "epoch  801: loss = 1756291.905312, a = 758.134188, b = 152.641328\n",
      "epoch  802: loss = 1756146.358003, a = 758.514696, b = 152.641085\n",
      "epoch  803: loss = 1756001.390496, a = 758.894442, b = 152.640843\n",
      "epoch  804: loss = 1755857.000479, a = 759.273430, b = 152.640601\n",
      "epoch  805: loss = 1755713.185647, a = 759.651659, b = 152.640359\n",
      "epoch  806: loss = 1755569.943706, a = 760.029132, b = 152.640118\n",
      "epoch  807: loss = 1755427.272371, a = 760.405851, b = 152.639877\n",
      "epoch  808: loss = 1755285.169365, a = 760.781816, b = 152.639637\n",
      "epoch  809: loss = 1755143.632421, a = 761.157029, b = 152.639398\n",
      "epoch  810: loss = 1755002.659280, a = 761.531492, b = 152.639158\n",
      "epoch  811: loss = 1754862.247693, a = 761.905206, b = 152.638920\n",
      "epoch  812: loss = 1754722.395421, a = 762.278173, b = 152.638681\n",
      "epoch  813: loss = 1754583.100231, a = 762.650394, b = 152.638444\n",
      "epoch  814: loss = 1754444.359902, a = 763.021870, b = 152.638206\n",
      "epoch  815: loss = 1754306.172220, a = 763.392604, b = 152.637970\n",
      "epoch  816: loss = 1754168.534980, a = 763.762597, b = 152.637733\n",
      "epoch  817: loss = 1754031.445986, a = 764.131849, b = 152.637498\n",
      "epoch  818: loss = 1753894.903051, a = 764.500363, b = 152.637262\n",
      "epoch  819: loss = 1753758.903998, a = 764.868141, b = 152.637027\n",
      "epoch  820: loss = 1753623.446655, a = 765.235183, b = 152.636793\n",
      "epoch  821: loss = 1753488.528863, a = 765.601491, b = 152.636559\n",
      "epoch  822: loss = 1753354.148468, a = 765.967066, b = 152.636325\n",
      "epoch  823: loss = 1753220.303328, a = 766.331911, b = 152.636092\n",
      "epoch  824: loss = 1753086.991306, a = 766.696025, b = 152.635860\n",
      "epoch  825: loss = 1752954.210276, a = 767.059412, b = 152.635628\n",
      "epoch  826: loss = 1752821.958120, a = 767.422072, b = 152.635396\n",
      "epoch  827: loss = 1752690.232728, a = 767.784007, b = 152.635165\n",
      "epoch  828: loss = 1752559.031999, a = 768.145218, b = 152.634934\n",
      "epoch  829: loss = 1752428.353839, a = 768.505707, b = 152.634704\n",
      "epoch  830: loss = 1752298.196165, a = 768.865475, b = 152.634474\n",
      "epoch  831: loss = 1752168.556899, a = 769.224524, b = 152.634245\n",
      "epoch  832: loss = 1752039.433974, a = 769.582854, b = 152.634016\n",
      "epoch  833: loss = 1751910.825331, a = 769.940468, b = 152.633788\n",
      "epoch  834: loss = 1751782.728917, a = 770.297367, b = 152.633560\n",
      "epoch  835: loss = 1751655.142689, a = 770.653552, b = 152.633332\n",
      "epoch  836: loss = 1751528.064612, a = 771.009025, b = 152.633105\n",
      "epoch  837: loss = 1751401.492660, a = 771.363788, b = 152.632879\n",
      "epoch  838: loss = 1751275.424813, a = 771.717840, b = 152.632652\n",
      "epoch  839: loss = 1751149.859059, a = 772.071185, b = 152.632427\n",
      "epoch  840: loss = 1751024.793398, a = 772.423823, b = 152.632201\n",
      "epoch  841: loss = 1750900.225833, a = 772.775756, b = 152.631977\n",
      "epoch  842: loss = 1750776.154377, a = 773.126986, b = 152.631752\n",
      "epoch  843: loss = 1750652.577052, a = 773.477513, b = 152.631529\n",
      "epoch  844: loss = 1750529.491887, a = 773.827339, b = 152.631305\n",
      "epoch  845: loss = 1750406.896918, a = 774.176465, b = 152.631082\n",
      "epoch  846: loss = 1750284.790190, a = 774.524893, b = 152.630860\n",
      "epoch  847: loss = 1750163.169756, a = 774.872625, b = 152.630637\n",
      "epoch  848: loss = 1750042.033675, a = 775.219661, b = 152.630416\n",
      "epoch  849: loss = 1749921.380017, a = 775.566004, b = 152.630195\n",
      "epoch  850: loss = 1749801.206855, a = 775.911653, b = 152.629974\n",
      "epoch  851: loss = 1749681.512274, a = 776.256612, b = 152.629754\n",
      "epoch  852: loss = 1749562.294365, a = 776.600881, b = 152.629534\n",
      "epoch  853: loss = 1749443.551226, a = 776.944461, b = 152.629314\n",
      "epoch  854: loss = 1749325.280964, a = 777.287354, b = 152.629095\n",
      "epoch  855: loss = 1749207.481692, a = 777.629562, b = 152.628877\n",
      "epoch  856: loss = 1749090.151532, a = 777.971085, b = 152.628658\n",
      "epoch  857: loss = 1748973.288613, a = 778.311925, b = 152.628441\n",
      "epoch  858: loss = 1748856.891070, a = 778.652084, b = 152.628224\n",
      "epoch  859: loss = 1748740.957047, a = 778.991563, b = 152.628007\n",
      "epoch  860: loss = 1748625.484697, a = 779.330363, b = 152.627790\n",
      "epoch  861: loss = 1748510.472176, a = 779.668485, b = 152.627574\n",
      "epoch  862: loss = 1748395.917651, a = 780.005931, b = 152.627359\n",
      "epoch  863: loss = 1748281.819296, a = 780.342702, b = 152.627144\n",
      "epoch  864: loss = 1748168.175290, a = 780.678800, b = 152.626929\n",
      "epoch  865: loss = 1748054.983822, a = 781.014226, b = 152.626715\n",
      "epoch  866: loss = 1747942.243086, a = 781.348981, b = 152.626501\n",
      "epoch  867: loss = 1747829.951284, a = 781.683067, b = 152.626288\n",
      "epoch  868: loss = 1747718.106627, a = 782.016484, b = 152.626075\n",
      "epoch  869: loss = 1747606.707330, a = 782.349235, b = 152.625862\n",
      "epoch  870: loss = 1747495.751617, a = 782.681321, b = 152.625650\n",
      "epoch  871: loss = 1747385.237718, a = 783.012742, b = 152.625438\n",
      "epoch  872: loss = 1747275.163873, a = 783.343501, b = 152.625227\n",
      "epoch  873: loss = 1747165.528325, a = 783.673598, b = 152.625016\n",
      "epoch  874: loss = 1747056.329325, a = 784.003035, b = 152.624806\n",
      "epoch  875: loss = 1746947.565134, a = 784.331814, b = 152.624596\n",
      "epoch  876: loss = 1746839.234017, a = 784.659935, b = 152.624386\n",
      "epoch  877: loss = 1746731.334246, a = 784.987400, b = 152.624177\n",
      "epoch  878: loss = 1746623.864101, a = 785.314210, b = 152.623968\n",
      "epoch  879: loss = 1746516.821869, a = 785.640366, b = 152.623760\n",
      "epoch  880: loss = 1746410.205842, a = 785.965871, b = 152.623552\n",
      "epoch  881: loss = 1746304.014321, a = 786.290724, b = 152.623345\n",
      "epoch  882: loss = 1746198.245613, a = 786.614928, b = 152.623138\n",
      "epoch  883: loss = 1746092.898031, a = 786.938483, b = 152.622931\n",
      "epoch  884: loss = 1745987.969896, a = 787.261392, b = 152.622725\n",
      "epoch  885: loss = 1745883.459534, a = 787.583655, b = 152.622519\n",
      "epoch  886: loss = 1745779.365280, a = 787.905273, b = 152.622314\n",
      "epoch  887: loss = 1745675.685474, a = 788.226248, b = 152.622109\n",
      "epoch  888: loss = 1745572.418463, a = 788.546582, b = 152.621904\n",
      "epoch  889: loss = 1745469.562600, a = 788.866275, b = 152.621700\n",
      "epoch  890: loss = 1745367.116247, a = 789.185328, b = 152.621496\n",
      "epoch  891: loss = 1745265.077768, a = 789.503744, b = 152.621293\n",
      "epoch  892: loss = 1745163.445539, a = 789.821523, b = 152.621090\n",
      "epoch  893: loss = 1745062.217938, a = 790.138666, b = 152.620887\n",
      "epoch  894: loss = 1744961.393352, a = 790.455175, b = 152.620685\n",
      "epoch  895: loss = 1744860.970173, a = 790.771052, b = 152.620483\n",
      "epoch  896: loss = 1744760.946801, a = 791.086296, b = 152.620282\n",
      "epoch  897: loss = 1744661.321640, a = 791.400911, b = 152.620081\n",
      "epoch  898: loss = 1744562.093104, a = 791.714896, b = 152.619880\n",
      "epoch  899: loss = 1744463.259609, a = 792.028253, b = 152.619680\n",
      "epoch  900: loss = 1744364.819581, a = 792.340984, b = 152.619480\n",
      "epoch  901: loss = 1744266.771451, a = 792.653089, b = 152.619281\n",
      "epoch  902: loss = 1744169.113654, a = 792.964570, b = 152.619082\n",
      "epoch  903: loss = 1744071.844635, a = 793.275429, b = 152.618884\n",
      "epoch  904: loss = 1743974.962844, a = 793.585665, b = 152.618685\n",
      "epoch  905: loss = 1743878.466735, a = 793.895282, b = 152.618488\n",
      "epoch  906: loss = 1743782.354770, a = 794.204279, b = 152.618290\n",
      "epoch  907: loss = 1743686.625419, a = 794.512658, b = 152.618093\n",
      "epoch  908: loss = 1743591.277154, a = 794.820421, b = 152.617897\n",
      "epoch  909: loss = 1743496.308456, a = 795.127568, b = 152.617701\n",
      "epoch  910: loss = 1743401.717811, a = 795.434101, b = 152.617505\n",
      "epoch  911: loss = 1743307.503711, a = 795.740021, b = 152.617310\n",
      "epoch  912: loss = 1743213.664656, a = 796.045330, b = 152.617115\n",
      "epoch  913: loss = 1743120.199149, a = 796.350028, b = 152.616920\n",
      "epoch  914: loss = 1743027.105700, a = 796.654116, b = 152.616726\n",
      "epoch  915: loss = 1742934.382825, a = 796.957597, b = 152.616532\n",
      "epoch  916: loss = 1742842.029048, a = 797.260470, b = 152.616338\n",
      "epoch  917: loss = 1742750.042895, a = 797.562738, b = 152.616145\n",
      "epoch  918: loss = 1742658.422902, a = 797.864402, b = 152.615953\n",
      "epoch  919: loss = 1742567.167606, a = 798.165462, b = 152.615760\n",
      "epoch  920: loss = 1742476.275556, a = 798.465920, b = 152.615568\n",
      "epoch  921: loss = 1742385.745300, a = 798.765778, b = 152.615377\n",
      "epoch  922: loss = 1742295.575398, a = 799.065036, b = 152.615186\n",
      "epoch  923: loss = 1742205.764411, a = 799.363695, b = 152.614995\n",
      "epoch  924: loss = 1742116.310909, a = 799.661757, b = 152.614805\n",
      "epoch  925: loss = 1742027.213466, a = 799.959223, b = 152.614615\n",
      "epoch  926: loss = 1741938.470661, a = 800.256095, b = 152.614425\n",
      "epoch  927: loss = 1741850.081082, a = 800.552373, b = 152.614236\n",
      "epoch  928: loss = 1741762.043319, a = 800.848058, b = 152.614047\n",
      "epoch  929: loss = 1741674.355969, a = 801.143152, b = 152.613859\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch  930: loss = 1741587.017634, a = 801.437656, b = 152.613670\n",
      "epoch  931: loss = 1741500.026924, a = 801.731571, b = 152.613483\n",
      "epoch  932: loss = 1741413.382452, a = 802.024898, b = 152.613295\n",
      "epoch  933: loss = 1741327.082837, a = 802.317639, b = 152.613108\n",
      "epoch  934: loss = 1741241.126703, a = 802.609794, b = 152.612922\n",
      "epoch  935: loss = 1741155.512682, a = 802.901365, b = 152.612736\n",
      "epoch  936: loss = 1741070.239409, a = 803.192353, b = 152.612550\n",
      "epoch  937: loss = 1740985.305526, a = 803.482759, b = 152.612364\n",
      "epoch  938: loss = 1740900.709678, a = 803.772585, b = 152.612179\n",
      "epoch  939: loss = 1740816.450518, a = 804.061831, b = 152.611994\n",
      "epoch  940: loss = 1740732.526703, a = 804.350498, b = 152.611810\n",
      "epoch  941: loss = 1740648.936897, a = 804.638588, b = 152.611626\n",
      "epoch  942: loss = 1740565.679766, a = 804.926103, b = 152.611442\n",
      "epoch  943: loss = 1740482.753986, a = 805.213042, b = 152.611259\n",
      "epoch  944: loss = 1740400.158233, a = 805.499407, b = 152.611076\n",
      "epoch  945: loss = 1740317.891193, a = 805.785200, b = 152.610894\n",
      "epoch  946: loss = 1740235.951555, a = 806.070421, b = 152.610712\n",
      "epoch  947: loss = 1740154.338013, a = 806.355072, b = 152.610530\n",
      "epoch  948: loss = 1740073.049267, a = 806.639154, b = 152.610348\n",
      "epoch  949: loss = 1739992.084021, a = 806.922668, b = 152.610167\n",
      "epoch  950: loss = 1739911.440986, a = 807.205615, b = 152.609986\n",
      "epoch  951: loss = 1739831.118877, a = 807.487996, b = 152.609806\n",
      "epoch  952: loss = 1739751.116414, a = 807.769812, b = 152.609626\n",
      "epoch  953: loss = 1739671.432323, a = 808.051065, b = 152.609446\n",
      "epoch  954: loss = 1739592.065335, a = 808.331755, b = 152.609267\n",
      "epoch  955: loss = 1739513.014184, a = 808.611884, b = 152.609088\n",
      "epoch  956: loss = 1739434.277612, a = 808.891453, b = 152.608910\n",
      "epoch  957: loss = 1739355.854363, a = 809.170463, b = 152.608732\n",
      "epoch  958: loss = 1739277.743190, a = 809.448915, b = 152.608554\n",
      "epoch  959: loss = 1739199.942847, a = 809.726810, b = 152.608376\n",
      "epoch  960: loss = 1739122.452096, a = 810.004149, b = 152.608199\n",
      "epoch  961: loss = 1739045.269701, a = 810.280934, b = 152.608022\n",
      "epoch  962: loss = 1738968.394433, a = 810.557165, b = 152.607846\n",
      "epoch  963: loss = 1738891.825068, a = 810.832844, b = 152.607670\n",
      "epoch  964: loss = 1738815.560385, a = 811.107972, b = 152.607494\n",
      "epoch  965: loss = 1738739.599171, a = 811.382550, b = 152.607319\n",
      "epoch  966: loss = 1738663.940215, a = 811.656578, b = 152.607144\n",
      "epoch  967: loss = 1738588.582311, a = 811.930059, b = 152.606969\n",
      "epoch  968: loss = 1738513.524261, a = 812.202992, b = 152.606795\n",
      "epoch  969: loss = 1738438.764867, a = 812.475380, b = 152.606621\n",
      "epoch  970: loss = 1738364.302940, a = 812.747223, b = 152.606447\n",
      "epoch  971: loss = 1738290.137292, a = 813.018523, b = 152.606274\n",
      "epoch  972: loss = 1738216.266744, a = 813.289280, b = 152.606101\n",
      "epoch  973: loss = 1738142.690118, a = 813.559496, b = 152.605928\n",
      "epoch  974: loss = 1738069.406242, a = 813.829171, b = 152.605756\n",
      "epoch  975: loss = 1737996.413950, a = 814.098307, b = 152.605584\n",
      "epoch  976: loss = 1737923.712078, a = 814.366905, b = 152.605413\n",
      "epoch  977: loss = 1737851.299469, a = 814.634966, b = 152.605241\n",
      "epoch  978: loss = 1737779.174969, a = 814.902490, b = 152.605071\n",
      "epoch  979: loss = 1737707.337430, a = 815.169480, b = 152.604900\n",
      "epoch  980: loss = 1737635.785708, a = 815.435936, b = 152.604730\n",
      "epoch  981: loss = 1737564.518663, a = 815.701859, b = 152.604560\n",
      "epoch  982: loss = 1737493.535160, a = 815.967250, b = 152.604390\n",
      "epoch  983: loss = 1737422.834069, a = 816.232111, b = 152.604221\n",
      "epoch  984: loss = 1737352.414263, a = 816.496442, b = 152.604052\n",
      "epoch  985: loss = 1737282.274622, a = 816.760244, b = 152.603884\n",
      "epoch  986: loss = 1737212.414028, a = 817.023519, b = 152.603716\n",
      "epoch  987: loss = 1737142.831368, a = 817.286268, b = 152.603548\n",
      "epoch  988: loss = 1737073.525536, a = 817.548491, b = 152.603381\n",
      "epoch  989: loss = 1737004.495426, a = 817.810189, b = 152.603213\n",
      "epoch  990: loss = 1736935.739941, a = 818.071365, b = 152.603047\n",
      "epoch  991: loss = 1736867.257984, a = 818.332018, b = 152.602880\n",
      "epoch  992: loss = 1736799.048465, a = 818.592150, b = 152.602714\n",
      "epoch  993: loss = 1736731.110299, a = 818.851761, b = 152.602548\n",
      "epoch  994: loss = 1736663.442403, a = 819.110854, b = 152.602383\n",
      "epoch  995: loss = 1736596.043701, a = 819.369428, b = 152.602218\n",
      "epoch  996: loss = 1736528.913118, a = 819.627486, b = 152.602053\n",
      "epoch  997: loss = 1736462.049586, a = 819.885027, b = 152.601888\n",
      "epoch  998: loss = 1736395.452040, a = 820.142053, b = 152.601724\n",
      "epoch  999: loss = 1736329.119420, a = 820.398566, b = 152.601560\n",
      "epoch 1000: loss = 1736263.050670, a = 820.654565, b = 152.601397\n",
      "epoch 1001: loss = 1736197.244737, a = 820.910053, b = 152.601234\n",
      "epoch 1002: loss = 1736131.700574, a = 821.165029, b = 152.601071\n",
      "epoch 1003: loss = 1736066.417138, a = 821.419496, b = 152.600908\n",
      "epoch 1004: loss = 1736001.393389, a = 821.673454, b = 152.600746\n",
      "epoch 1005: loss = 1735936.628292, a = 821.926904, b = 152.600584\n",
      "epoch 1006: loss = 1735872.120815, a = 822.179847, b = 152.600422\n",
      "epoch 1007: loss = 1735807.869932, a = 822.432285, b = 152.600261\n",
      "epoch 1008: loss = 1735743.874619, a = 822.684217, b = 152.600100\n",
      "epoch 1009: loss = 1735680.133859, a = 822.935646, b = 152.599940\n",
      "epoch 1010: loss = 1735616.646635, a = 823.186572, b = 152.599780\n",
      "epoch 1011: loss = 1735553.411939, a = 823.436997, b = 152.599620\n",
      "epoch 1012: loss = 1735490.428761, a = 823.686920, b = 152.599460\n",
      "epoch 1013: loss = 1735427.696101, a = 823.936344, b = 152.599301\n",
      "epoch 1014: loss = 1735365.212960, a = 824.185269, b = 152.599142\n",
      "epoch 1015: loss = 1735302.978342, a = 824.433697, b = 152.598983\n",
      "epoch 1016: loss = 1735240.991257, a = 824.681627, b = 152.598825\n",
      "epoch 1017: loss = 1735179.250719, a = 824.929062, b = 152.598667\n",
      "epoch 1018: loss = 1735117.755744, a = 825.176002, b = 152.598509\n",
      "epoch 1019: loss = 1735056.505353, a = 825.422448, b = 152.598351\n",
      "epoch 1020: loss = 1734995.498573, a = 825.668401, b = 152.598194\n",
      "epoch 1021: loss = 1734934.734430, a = 825.913863, b = 152.598038\n",
      "epoch 1022: loss = 1734874.211960, a = 826.158833, b = 152.597881\n",
      "epoch 1023: loss = 1734813.930197, a = 826.403314, b = 152.597725\n",
      "epoch 1024: loss = 1734753.888182, a = 826.647306, b = 152.597569\n",
      "epoch 1025: loss = 1734694.084961, a = 826.890810, b = 152.597414\n",
      "epoch 1026: loss = 1734634.519580, a = 827.133827, b = 152.597258\n",
      "epoch 1027: loss = 1734575.191092, a = 827.376358, b = 152.597104\n",
      "epoch 1028: loss = 1734516.098553, a = 827.618405, b = 152.596949\n",
      "epoch 1029: loss = 1734457.241022, a = 827.859967, b = 152.596795\n",
      "epoch 1030: loss = 1734398.617562, a = 828.101046, b = 152.596641\n",
      "epoch 1031: loss = 1734340.227240, a = 828.341643, b = 152.596487\n",
      "epoch 1032: loss = 1734282.069127, a = 828.581759, b = 152.596334\n",
      "epoch 1033: loss = 1734224.142298, a = 828.821394, b = 152.596181\n",
      "epoch 1034: loss = 1734166.445830, a = 829.060551, b = 152.596028\n",
      "epoch 1035: loss = 1734108.978805, a = 829.299229, b = 152.595875\n",
      "epoch 1036: loss = 1734051.740309, a = 829.537430, b = 152.595723\n",
      "epoch 1037: loss = 1733994.729431, a = 829.775155, b = 152.595571\n",
      "epoch 1038: loss = 1733937.945263, a = 830.012405, b = 152.595420\n",
      "epoch 1039: loss = 1733881.386903, a = 830.249179, b = 152.595269\n",
      "epoch 1040: loss = 1733825.053449, a = 830.485481, b = 152.595118\n",
      "epoch 1041: loss = 1733768.944005, a = 830.721310, b = 152.594967\n",
      "epoch 1042: loss = 1733713.057679, a = 830.956667, b = 152.594817\n",
      "epoch 1043: loss = 1733657.393581, a = 831.191554, b = 152.594667\n",
      "epoch 1044: loss = 1733601.950825, a = 831.425971, b = 152.594517\n",
      "epoch 1045: loss = 1733546.728530, a = 831.659919, b = 152.594368\n",
      "epoch 1046: loss = 1733491.725816, a = 831.893400, b = 152.594218\n",
      "epoch 1047: loss = 1733436.941808, a = 832.126413, b = 152.594070\n",
      "epoch 1048: loss = 1733382.375635, a = 832.358961, b = 152.593921\n",
      "epoch 1049: loss = 1733328.026428, a = 832.591044, b = 152.593773\n",
      "epoch 1050: loss = 1733273.893322, a = 832.822662, b = 152.593625\n",
      "epoch 1051: loss = 1733219.975457, a = 833.053817, b = 152.593477\n",
      "epoch 1052: loss = 1733166.271975, a = 833.284511, b = 152.593330\n",
      "epoch 1053: loss = 1733112.782020, a = 833.514742, b = 152.593183\n",
      "epoch 1054: loss = 1733059.504742, a = 833.744514, b = 152.593036\n",
      "epoch 1055: loss = 1733006.439293, a = 833.973826, b = 152.592890\n",
      "epoch 1056: loss = 1732953.584830, a = 834.202679, b = 152.592744\n",
      "epoch 1057: loss = 1732900.940510, a = 834.431075, b = 152.592598\n",
      "epoch 1058: loss = 1732848.505497, a = 834.659014, b = 152.592452\n",
      "epoch 1059: loss = 1732796.278956, a = 834.886497, b = 152.592307\n",
      "epoch 1060: loss = 1732744.260056, a = 835.113526, b = 152.592162\n",
      "epoch 1061: loss = 1732692.447971, a = 835.340100, b = 152.592017\n",
      "epoch 1062: loss = 1732640.841875, a = 835.566221, b = 152.591873\n",
      "epoch 1063: loss = 1732589.440947, a = 835.791890, b = 152.591729\n",
      "epoch 1064: loss = 1732538.244371, a = 836.017108, b = 152.591585\n",
      "epoch 1065: loss = 1732487.251331, a = 836.241876, b = 152.591441\n",
      "epoch 1066: loss = 1732436.461017, a = 836.466194, b = 152.591298\n",
      "epoch 1067: loss = 1732385.872620, a = 836.690063, b = 152.591155\n",
      "epoch 1068: loss = 1732335.485336, a = 836.913485, b = 152.591012\n",
      "epoch 1069: loss = 1732285.298362, a = 837.136460, b = 152.590870\n",
      "epoch 1070: loss = 1732235.310902, a = 837.358990, b = 152.590728\n",
      "epoch 1071: loss = 1732185.522160, a = 837.581074, b = 152.590586\n",
      "epoch 1072: loss = 1732135.931343, a = 837.802714, b = 152.590444\n",
      "epoch 1073: loss = 1732086.537664, a = 838.023911, b = 152.590303\n",
      "epoch 1074: loss = 1732037.340336, a = 838.244665, b = 152.590162\n",
      "epoch 1075: loss = 1731988.338577, a = 838.464978, b = 152.590021\n",
      "epoch 1076: loss = 1731939.531607, a = 838.684851, b = 152.589881\n",
      "epoch 1077: loss = 1731890.918651, a = 838.904284, b = 152.589741\n",
      "epoch 1078: loss = 1731842.498935, a = 839.123278, b = 152.589601\n",
      "epoch 1079: loss = 1731794.271688, a = 839.341834, b = 152.589461\n",
      "epoch 1080: loss = 1731746.236145, a = 839.559954, b = 152.589322\n",
      "epoch 1081: loss = 1731698.391541, a = 839.777637, b = 152.589183\n",
      "epoch 1082: loss = 1731650.737115, a = 839.994884, b = 152.589044\n",
      "epoch 1083: loss = 1731603.272109, a = 840.211698, b = 152.588906\n",
      "epoch 1084: loss = 1731555.995768, a = 840.428077, b = 152.588767\n",
      "epoch 1085: loss = 1731508.907341, a = 840.644024, b = 152.588629\n",
      "epoch 1086: loss = 1731462.006079, a = 840.859540, b = 152.588492\n",
      "epoch 1087: loss = 1731415.291236, a = 841.074624, b = 152.588354\n",
      "epoch 1088: loss = 1731368.762068, a = 841.289278, b = 152.588217\n",
      "epoch 1089: loss = 1731322.417837, a = 841.503503, b = 152.588081\n",
      "epoch 1090: loss = 1731276.257805, a = 841.717299, b = 152.587944\n",
      "epoch 1091: loss = 1731230.281238, a = 841.930668, b = 152.587808\n",
      "epoch 1092: loss = 1731184.487405, a = 842.143611, b = 152.587672\n",
      "epoch 1093: loss = 1731138.875577, a = 842.356127, b = 152.587536\n",
      "epoch 1094: loss = 1731093.445031, a = 842.568219, b = 152.587401\n",
      "epoch 1095: loss = 1731048.195043, a = 842.779886, b = 152.587265\n",
      "epoch 1096: loss = 1731003.124893, a = 842.991131, b = 152.587130\n",
      "epoch 1097: loss = 1730958.233866, a = 843.201952, b = 152.586996\n",
      "epoch 1098: loss = 1730913.521247, a = 843.412353, b = 152.586861\n",
      "epoch 1099: loss = 1730868.986325, a = 843.622332, b = 152.586727\n",
      "epoch 1100: loss = 1730824.628393, a = 843.831892, b = 152.586593\n",
      "epoch 1101: loss = 1730780.446745, a = 844.041032, b = 152.586460\n",
      "epoch 1102: loss = 1730736.440678, a = 844.249755, b = 152.586327\n",
      "epoch 1103: loss = 1730692.609494, a = 844.458059, b = 152.586193\n",
      "epoch 1104: loss = 1730648.952495, a = 844.665948, b = 152.586061\n",
      "epoch 1105: loss = 1730605.468987, a = 844.873421, b = 152.585928\n",
      "epoch 1106: loss = 1730562.158279, a = 845.080478, b = 152.585796\n",
      "epoch 1107: loss = 1730519.019683, a = 845.287122, b = 152.585664\n",
      "epoch 1108: loss = 1730476.052512, a = 845.493353, b = 152.585532\n",
      "epoch 1109: loss = 1730433.256083, a = 845.699171, b = 152.585401\n",
      "epoch 1110: loss = 1730390.629717, a = 845.904578, b = 152.585270\n",
      "epoch 1111: loss = 1730348.172735, a = 846.109573, b = 152.585139\n",
      "epoch 1112: loss = 1730305.884463, a = 846.314159, b = 152.585008\n",
      "epoch 1113: loss = 1730263.764229, a = 846.518336, b = 152.584878\n",
      "epoch 1114: loss = 1730221.811362, a = 846.722105, b = 152.584747\n",
      "epoch 1115: loss = 1730180.025197, a = 846.925466, b = 152.584618\n",
      "epoch 1116: loss = 1730138.405068, a = 847.128420, b = 152.584488\n",
      "epoch 1117: loss = 1730096.950315, a = 847.330969, b = 152.584359\n",
      "epoch 1118: loss = 1730055.660278, a = 847.533112, b = 152.584229\n",
      "epoch 1119: loss = 1730014.534302, a = 847.734852, b = 152.584101\n",
      "epoch 1120: loss = 1729973.571731, a = 847.936188, b = 152.583972\n",
      "epoch 1121: loss = 1729932.771917, a = 848.137121, b = 152.583844\n",
      "epoch 1122: loss = 1729892.134209, a = 848.337652, b = 152.583716\n",
      "epoch 1123: loss = 1729851.657962, a = 848.537783, b = 152.583588\n",
      "epoch 1124: loss = 1729811.342534, a = 848.737513, b = 152.583460\n",
      "epoch 1125: loss = 1729771.187282, a = 848.936844, b = 152.583333\n",
      "epoch 1126: loss = 1729731.191569, a = 849.135776, b = 152.583206\n",
      "epoch 1127: loss = 1729691.354760, a = 849.334311, b = 152.583079\n",
      "epoch 1128: loss = 1729651.676220, a = 849.532449, b = 152.582952\n",
      "epoch 1129: loss = 1729612.155321, a = 849.730190, b = 152.582826\n",
      "epoch 1130: loss = 1729572.791433, a = 849.927536, b = 152.582700\n",
      "epoch 1131: loss = 1729533.583931, a = 850.124487, b = 152.582574\n",
      "epoch 1132: loss = 1729494.532192, a = 850.321044, b = 152.582449\n",
      "epoch 1133: loss = 1729455.635596, a = 850.517209, b = 152.582324\n",
      "epoch 1134: loss = 1729416.893524, a = 850.712981, b = 152.582198\n",
      "epoch 1135: loss = 1729378.305361, a = 850.908362, b = 152.582074\n",
      "epoch 1136: loss = 1729339.870493, a = 851.103352, b = 152.581949\n",
      "epoch 1137: loss = 1729301.588311, a = 851.297952, b = 152.581825\n",
      "epoch 1138: loss = 1729263.458205, a = 851.492162, b = 152.581701\n",
      "epoch 1139: loss = 1729225.479569, a = 851.685985, b = 152.581577\n",
      "epoch 1140: loss = 1729187.651801, a = 851.879420, b = 152.581453\n",
      "epoch 1141: loss = 1729149.974300, a = 852.072468, b = 152.581330\n",
      "epoch 1142: loss = 1729112.446466, a = 852.265130, b = 152.581207\n",
      "epoch 1143: loss = 1729075.067703, a = 852.457407, b = 152.581084\n",
      "epoch 1144: loss = 1729037.837419, a = 852.649299, b = 152.580962\n",
      "epoch 1145: loss = 1729000.755020, a = 852.840808, b = 152.580839\n",
      "epoch 1146: loss = 1728963.819918, a = 853.031934, b = 152.580717\n",
      "epoch 1147: loss = 1728927.031526, a = 853.222677, b = 152.580596\n",
      "epoch 1148: loss = 1728890.389260, a = 853.413039, b = 152.580474\n",
      "epoch 1149: loss = 1728853.892538, a = 853.603021, b = 152.580353\n",
      "epoch 1150: loss = 1728817.540780, a = 853.792622, b = 152.580232\n",
      "epoch 1151: loss = 1728781.333408, a = 853.981845, b = 152.580111\n",
      "epoch 1152: loss = 1728745.269847, a = 854.170689, b = 152.579990\n",
      "epoch 1153: loss = 1728709.349524, a = 854.359155, b = 152.579870\n",
      "epoch 1154: loss = 1728673.571869, a = 854.547245, b = 152.579750\n",
      "epoch 1155: loss = 1728637.936314, a = 854.734958, b = 152.579630\n",
      "epoch 1156: loss = 1728602.442292, a = 854.922296, b = 152.579510\n",
      "epoch 1157: loss = 1728567.089239, a = 855.109259, b = 152.579391\n",
      "epoch 1158: loss = 1728531.876595, a = 855.295849, b = 152.579271\n",
      "epoch 1159: loss = 1728496.803799, a = 855.482065, b = 152.579152\n",
      "epoch 1160: loss = 1728461.870295, a = 855.667909, b = 152.579034\n",
      "epoch 1161: loss = 1728427.075528, a = 855.853382, b = 152.578915\n",
      "epoch 1162: loss = 1728392.418945, a = 856.038483, b = 152.578797\n",
      "epoch 1163: loss = 1728357.899996, a = 856.223215, b = 152.578679\n",
      "epoch 1164: loss = 1728323.518132, a = 856.407577, b = 152.578561\n",
      "epoch 1165: loss = 1728289.272808, a = 856.591570, b = 152.578444\n",
      "epoch 1166: loss = 1728255.163480, a = 856.775195, b = 152.578327\n",
      "epoch 1167: loss = 1728221.189605, a = 856.958454, b = 152.578210\n",
      "epoch 1168: loss = 1728187.350645, a = 857.141345, b = 152.578093\n",
      "epoch 1169: loss = 1728153.646062, a = 857.323871, b = 152.577976\n",
      "epoch 1170: loss = 1728120.075320, a = 857.506033, b = 152.577860\n",
      "epoch 1171: loss = 1728086.637887, a = 857.687829, b = 152.577744\n",
      "epoch 1172: loss = 1728053.333232, a = 857.869263, b = 152.577628\n",
      "epoch 1173: loss = 1728020.160826, a = 858.050333, b = 152.577512\n",
      "epoch 1174: loss = 1727987.120142, a = 858.231041, b = 152.577397\n",
      "epoch 1175: loss = 1727954.210655, a = 858.411388, b = 152.577282\n",
      "epoch 1176: loss = 1727921.431843, a = 858.591375, b = 152.577167\n",
      "epoch 1177: loss = 1727888.783186, a = 858.771001, b = 152.577052\n",
      "epoch 1178: loss = 1727856.264164, a = 858.950268, b = 152.576937\n",
      "epoch 1179: loss = 1727823.874263, a = 859.129177, b = 152.576823\n",
      "epoch 1180: loss = 1727791.612966, a = 859.307728, b = 152.576709\n",
      "epoch 1181: loss = 1727759.479763, a = 859.485922, b = 152.576595\n",
      "epoch 1182: loss = 1727727.474143, a = 859.663760, b = 152.576482\n",
      "epoch 1183: loss = 1727695.595598, a = 859.841242, b = 152.576368\n",
      "epoch 1184: loss = 1727663.843621, a = 860.018369, b = 152.576255\n",
      "epoch 1185: loss = 1727632.217709, a = 860.195142, b = 152.576142\n",
      "epoch 1186: loss = 1727600.717360, a = 860.371562, b = 152.576030\n",
      "epoch 1187: loss = 1727569.342073, a = 860.547628, b = 152.575917\n",
      "epoch 1188: loss = 1727538.091351, a = 860.723343, b = 152.575805\n",
      "epoch 1189: loss = 1727506.964697, a = 860.898706, b = 152.575693\n",
      "epoch 1190: loss = 1727475.961618, a = 861.073719, b = 152.575581\n",
      "epoch 1191: loss = 1727445.081620, a = 861.248381, b = 152.575470\n",
      "epoch 1192: loss = 1727414.324214, a = 861.422695, b = 152.575358\n",
      "epoch 1193: loss = 1727383.688912, a = 861.596659, b = 152.575247\n",
      "epoch 1194: loss = 1727353.175228, a = 861.770276, b = 152.575136\n",
      "epoch 1195: loss = 1727322.782676, a = 861.943546, b = 152.575026\n",
      "epoch 1196: loss = 1727292.510775, a = 862.116469, b = 152.574915\n",
      "epoch 1197: loss = 1727262.359044, a = 862.289047, b = 152.574805\n",
      "epoch 1198: loss = 1727232.327005, a = 862.461279, b = 152.574695\n",
      "epoch 1199: loss = 1727202.414181, a = 862.633167, b = 152.574585\n",
      "epoch 1200: loss = 1727172.620097, a = 862.804711, b = 152.574476\n",
      "epoch 1201: loss = 1727142.944280, a = 862.975912, b = 152.574366\n",
      "epoch 1202: loss = 1727113.386259, a = 863.146771, b = 152.574257\n",
      "epoch 1203: loss = 1727083.945566, a = 863.317288, b = 152.574148\n",
      "epoch 1204: loss = 1727054.621733, a = 863.487464, b = 152.574039\n",
      "epoch 1205: loss = 1727025.414294, a = 863.657300, b = 152.573931\n",
      "epoch 1206: loss = 1726996.322787, a = 863.826797, b = 152.573823\n",
      "epoch 1207: loss = 1726967.346749, a = 863.995954, b = 152.573715\n",
      "epoch 1208: loss = 1726938.485720, a = 864.164773, b = 152.573607\n",
      "epoch 1209: loss = 1726909.739243, a = 864.333255, b = 152.573499\n",
      "epoch 1210: loss = 1726881.106862, a = 864.501399, b = 152.573392\n",
      "epoch 1211: loss = 1726852.588122, a = 864.669208, b = 152.573285\n",
      "epoch 1212: loss = 1726824.182571, a = 864.836680, b = 152.573178\n",
      "epoch 1213: loss = 1726795.889757, a = 865.003818, b = 152.573071\n",
      "epoch 1214: loss = 1726767.709233, a = 865.170622, b = 152.572964\n",
      "epoch 1215: loss = 1726739.640550, a = 865.337092, b = 152.572858\n",
      "epoch 1216: loss = 1726711.683264, a = 865.503229, b = 152.572752\n",
      "epoch 1217: loss = 1726683.836931, a = 865.669034, b = 152.572646\n",
      "epoch 1218: loss = 1726656.101109, a = 865.834508, b = 152.572540\n",
      "epoch 1219: loss = 1726628.475358, a = 865.999650, b = 152.572435\n",
      "epoch 1220: loss = 1726600.959240, a = 866.164463, b = 152.572330\n",
      "epoch 1221: loss = 1726573.552318, a = 866.328946, b = 152.572225\n",
      "epoch 1222: loss = 1726546.254158, a = 866.493100, b = 152.572120\n",
      "epoch 1223: loss = 1726519.064326, a = 866.656925, b = 152.572015\n",
      "epoch 1224: loss = 1726491.982391, a = 866.820423, b = 152.571911\n",
      "epoch 1225: loss = 1726465.007924, a = 866.983594, b = 152.571807\n",
      "epoch 1226: loss = 1726438.140496, a = 867.146439, b = 152.571702\n",
      "epoch 1227: loss = 1726411.379682, a = 867.308958, b = 152.571599\n",
      "epoch 1228: loss = 1726384.725056, a = 867.471152, b = 152.571495\n",
      "epoch 1229: loss = 1726358.176197, a = 867.633022, b = 152.571392\n",
      "epoch 1230: loss = 1726331.732682, a = 867.794568, b = 152.571289\n",
      "epoch 1231: loss = 1726305.394093, a = 867.955792, b = 152.571186\n",
      "epoch 1232: loss = 1726279.160012, a = 868.116692, b = 152.571083\n",
      "epoch 1233: loss = 1726253.030023, a = 868.277271, b = 152.570980\n",
      "epoch 1234: loss = 1726227.003711, a = 868.437529, b = 152.570878\n",
      "epoch 1235: loss = 1726201.080663, a = 868.597467, b = 152.570776\n",
      "epoch 1236: loss = 1726175.260468, a = 868.757084, b = 152.570674\n",
      "epoch 1237: loss = 1726149.542718, a = 868.916383, b = 152.570572\n",
      "epoch 1238: loss = 1726123.927003, a = 869.075362, b = 152.570471\n",
      "epoch 1239: loss = 1726098.412918, a = 869.234024, b = 152.570369\n",
      "epoch 1240: loss = 1726073.000058, a = 869.392369, b = 152.570268\n",
      "epoch 1241: loss = 1726047.688020, a = 869.550397, b = 152.570167\n",
      "epoch 1242: loss = 1726022.476403, a = 869.708109, b = 152.570066\n",
      "epoch 1243: loss = 1725997.364807, a = 869.865506, b = 152.569966\n",
      "epoch 1244: loss = 1725972.352833, a = 870.022588, b = 152.569866\n",
      "epoch 1245: loss = 1725947.440086, a = 870.179356, b = 152.569765\n",
      "epoch 1246: loss = 1725922.626169, a = 870.335810, b = 152.569665\n",
      "epoch 1247: loss = 1725897.910690, a = 870.491951, b = 152.569566\n",
      "epoch 1248: loss = 1725873.293257, a = 870.647781, b = 152.569466\n",
      "epoch 1249: loss = 1725848.773479, a = 870.803298, b = 152.569367\n",
      "epoch 1250: loss = 1725824.350968, a = 870.958505, b = 152.569268\n",
      "epoch 1251: loss = 1725800.025336, a = 871.113401, b = 152.569169\n",
      "epoch 1252: loss = 1725775.796198, a = 871.267988, b = 152.569070\n",
      "epoch 1253: loss = 1725751.663170, a = 871.422265, b = 152.568972\n",
      "epoch 1254: loss = 1725727.625869, a = 871.576234, b = 152.568873\n",
      "epoch 1255: loss = 1725703.683913, a = 871.729895, b = 152.568775\n",
      "epoch 1256: loss = 1725679.836924, a = 871.883249, b = 152.568677\n",
      "epoch 1257: loss = 1725656.084523, a = 872.036296, b = 152.568579\n",
      "epoch 1258: loss = 1725632.426334, a = 872.189037, b = 152.568482\n",
      "epoch 1259: loss = 1725608.861981, a = 872.341473, b = 152.568384\n",
      "epoch 1260: loss = 1725585.391092, a = 872.493604, b = 152.568287\n",
      "epoch 1261: loss = 1725562.013294, a = 872.645430, b = 152.568190\n",
      "epoch 1262: loss = 1725538.728217, a = 872.796953, b = 152.568094\n",
      "epoch 1263: loss = 1725515.535491, a = 872.948173, b = 152.567997\n",
      "epoch 1264: loss = 1725492.434749, a = 873.099091, b = 152.567901\n",
      "epoch 1265: loss = 1725469.425625, a = 873.249707, b = 152.567804\n",
      "epoch 1266: loss = 1725446.507753, a = 873.400021, b = 152.567708\n",
      "epoch 1267: loss = 1725423.680772, a = 873.550035, b = 152.567613\n",
      "epoch 1268: loss = 1725400.944319, a = 873.699749, b = 152.567517\n",
      "epoch 1269: loss = 1725378.298033, a = 873.849164, b = 152.567421\n",
      "epoch 1270: loss = 1725355.741556, a = 873.998280, b = 152.567326\n",
      "epoch 1271: loss = 1725333.274530, a = 874.147098, b = 152.567231\n",
      "epoch 1272: loss = 1725310.896600, a = 874.295618, b = 152.567136\n",
      "epoch 1273: loss = 1725288.607410, a = 874.443841, b = 152.567042\n",
      "epoch 1274: loss = 1725266.406608, a = 874.591768, b = 152.566947\n",
      "epoch 1275: loss = 1725244.293841, a = 874.739399, b = 152.566853\n",
      "epoch 1276: loss = 1725222.268760, a = 874.886735, b = 152.566759\n",
      "epoch 1277: loss = 1725200.331014, a = 875.033776, b = 152.566665\n",
      "epoch 1278: loss = 1725178.480257, a = 875.180523, b = 152.566571\n",
      "epoch 1279: loss = 1725156.716143, a = 875.326977, b = 152.566478\n",
      "epoch 1280: loss = 1725135.038326, a = 875.473137, b = 152.566384\n",
      "epoch 1281: loss = 1725113.446463, a = 875.619006, b = 152.566291\n",
      "epoch 1282: loss = 1725091.940212, a = 875.764583, b = 152.566198\n",
      "epoch 1283: loss = 1725070.519232, a = 875.909868, b = 152.566105\n",
      "epoch 1284: loss = 1725049.183184, a = 876.054864, b = 152.566013\n",
      "epoch 1285: loss = 1725027.931730, a = 876.199569, b = 152.565920\n",
      "epoch 1286: loss = 1725006.764533, a = 876.343985, b = 152.565828\n",
      "epoch 1287: loss = 1724985.681258, a = 876.488112, b = 152.565736\n",
      "epoch 1288: loss = 1724964.681570, a = 876.631951, b = 152.565644\n",
      "epoch 1289: loss = 1724943.765137, a = 876.775502, b = 152.565552\n",
      "epoch 1290: loss = 1724922.931629, a = 876.918766, b = 152.565461\n",
      "epoch 1291: loss = 1724902.180714, a = 877.061744, b = 152.565370\n",
      "epoch 1292: loss = 1724881.512064, a = 877.204436, b = 152.565278\n",
      "epoch 1293: loss = 1724860.925351, a = 877.346842, b = 152.565188\n",
      "epoch 1294: loss = 1724840.420250, a = 877.488964, b = 152.565097\n",
      "epoch 1295: loss = 1724819.996436, a = 877.630802, b = 152.565006\n",
      "epoch 1296: loss = 1724799.653585, a = 877.772356, b = 152.564916\n",
      "epoch 1297: loss = 1724779.391376, a = 877.913626, b = 152.564826\n",
      "epoch 1298: loss = 1724759.209486, a = 878.054615, b = 152.564735\n",
      "epoch 1299: loss = 1724739.107597, a = 878.195321, b = 152.564646\n",
      "epoch 1300: loss = 1724719.085390, a = 878.335746, b = 152.564556\n",
      "epoch 1301: loss = 1724699.142548, a = 878.475891, b = 152.564466\n",
      "epoch 1302: loss = 1724679.278756, a = 878.615755, b = 152.564377\n",
      "epoch 1303: loss = 1724659.493698, a = 878.755339, b = 152.564288\n",
      "epoch 1304: loss = 1724639.787061, a = 878.894644, b = 152.564199\n",
      "epoch 1305: loss = 1724620.158533, a = 879.033671, b = 152.564110\n",
      "epoch 1306: loss = 1724600.607805, a = 879.172419, b = 152.564022\n",
      "epoch 1307: loss = 1724581.134564, a = 879.310891, b = 152.563933\n",
      "epoch 1308: loss = 1724561.738505, a = 879.449085, b = 152.563845\n",
      "epoch 1309: loss = 1724542.419319, a = 879.587003, b = 152.563757\n",
      "epoch 1310: loss = 1724523.176700, a = 879.724645, b = 152.563669\n",
      "epoch 1311: loss = 1724504.010344, a = 879.862012, b = 152.563581\n",
      "epoch 1312: loss = 1724484.919948, a = 879.999104, b = 152.563494\n",
      "epoch 1313: loss = 1724465.905208, a = 880.135922, b = 152.563406\n",
      "epoch 1314: loss = 1724446.965825, a = 880.272467, b = 152.563319\n",
      "epoch 1315: loss = 1724428.101498, a = 880.408738, b = 152.563232\n",
      "epoch 1316: loss = 1724409.311929, a = 880.544737, b = 152.563145\n",
      "epoch 1317: loss = 1724390.596819, a = 880.680464, b = 152.563058\n",
      "epoch 1318: loss = 1724371.955874, a = 880.815920, b = 152.562972\n",
      "epoch 1319: loss = 1724353.388797, a = 880.951104, b = 152.562886\n",
      "epoch 1320: loss = 1724334.895295, a = 881.086019, b = 152.562799\n",
      "epoch 1321: loss = 1724316.475075, a = 881.220663, b = 152.562713\n",
      "epoch 1322: loss = 1724298.127846, a = 881.355039, b = 152.562628\n",
      "epoch 1323: loss = 1724279.853317, a = 881.489145, b = 152.562542\n",
      "epoch 1324: loss = 1724261.651198, a = 881.622984, b = 152.562456\n",
      "epoch 1325: loss = 1724243.521203, a = 881.756555, b = 152.562371\n",
      "epoch 1326: loss = 1724225.463043, a = 881.889859, b = 152.562286\n",
      "epoch 1327: loss = 1724207.476433, a = 882.022896, b = 152.562201\n",
      "epoch 1328: loss = 1724189.561089, a = 882.155667, b = 152.562116\n",
      "epoch 1329: loss = 1724171.716726, a = 882.288173, b = 152.562032\n",
      "epoch 1330: loss = 1724153.943063, a = 882.420413, b = 152.561947\n",
      "epoch 1331: loss = 1724136.239817, a = 882.552390, b = 152.561863\n",
      "epoch 1332: loss = 1724118.606710, a = 882.684102, b = 152.561779\n",
      "epoch 1333: loss = 1724101.043462, a = 882.815551, b = 152.561695\n",
      "epoch 1334: loss = 1724083.549795, a = 882.946737, b = 152.561611\n",
      "epoch 1335: loss = 1724066.125431, a = 883.077661, b = 152.561527\n",
      "epoch 1336: loss = 1724048.770097, a = 883.208323, b = 152.561444\n",
      "epoch 1337: loss = 1724031.483516, a = 883.338724, b = 152.561361\n",
      "epoch 1338: loss = 1724014.265415, a = 883.468864, b = 152.561277\n",
      "epoch 1339: loss = 1723997.115522, a = 883.598743, b = 152.561194\n",
      "epoch 1340: loss = 1723980.033566, a = 883.728363, b = 152.561112\n",
      "epoch 1341: loss = 1723963.019276, a = 883.857724, b = 152.561029\n",
      "epoch 1342: loss = 1723946.072383, a = 883.986826, b = 152.560947\n",
      "epoch 1343: loss = 1723929.192619, a = 884.115670, b = 152.560864\n",
      "epoch 1344: loss = 1723912.379717, a = 884.244256, b = 152.560782\n",
      "epoch 1345: loss = 1723895.633411, a = 884.372586, b = 152.560700\n",
      "epoch 1346: loss = 1723878.953436, a = 884.500658, b = 152.560618\n",
      "epoch 1347: loss = 1723862.339528, a = 884.628475, b = 152.560537\n",
      "epoch 1348: loss = 1723845.791425, a = 884.756036, b = 152.560455\n",
      "epoch 1349: loss = 1723829.308864, a = 884.883341, b = 152.560374\n",
      "epoch 1350: loss = 1723812.891585, a = 885.010393, b = 152.560293\n",
      "epoch 1351: loss = 1723796.539328, a = 885.137190, b = 152.560212\n",
      "epoch 1352: loss = 1723780.251834, a = 885.263733, b = 152.560131\n",
      "epoch 1353: loss = 1723764.028847, a = 885.390024, b = 152.560050\n",
      "epoch 1354: loss = 1723747.870109, a = 885.516062, b = 152.559970\n",
      "epoch 1355: loss = 1723731.775364, a = 885.641848, b = 152.559890\n",
      "epoch 1356: loss = 1723715.744359, a = 885.767382, b = 152.559809\n",
      "epoch 1357: loss = 1723699.776840, a = 885.892666, b = 152.559729\n",
      "epoch 1358: loss = 1723683.872554, a = 886.017699, b = 152.559649\n",
      "epoch 1359: loss = 1723668.031249, a = 886.142482, b = 152.559570\n",
      "epoch 1360: loss = 1723652.252676, a = 886.267015, b = 152.559490\n",
      "epoch 1361: loss = 1723636.536584, a = 886.391299, b = 152.559411\n",
      "epoch 1362: loss = 1723620.882726, a = 886.515335, b = 152.559332\n",
      "epoch 1363: loss = 1723605.290853, a = 886.639123, b = 152.559253\n",
      "epoch 1364: loss = 1723589.760719, a = 886.762663, b = 152.559174\n",
      "epoch 1365: loss = 1723574.292078, a = 886.885956, b = 152.559095\n",
      "epoch 1366: loss = 1723558.884687, a = 887.009003, b = 152.559016\n",
      "epoch 1367: loss = 1723543.538300, a = 887.131804, b = 152.558938\n",
      "epoch 1368: loss = 1723528.252677, a = 887.254359, b = 152.558860\n",
      "epoch 1369: loss = 1723513.027574, a = 887.376669, b = 152.558782\n",
      "epoch 1370: loss = 1723497.862752, a = 887.498734, b = 152.558704\n",
      "epoch 1371: loss = 1723482.757971, a = 887.620555, b = 152.558626\n",
      "epoch 1372: loss = 1723467.712991, a = 887.742133, b = 152.558548\n",
      "epoch 1373: loss = 1723452.727575, a = 887.863468, b = 152.558471\n",
      "epoch 1374: loss = 1723437.801486, a = 887.984560, b = 152.558393\n",
      "epoch 1375: loss = 1723422.934489, a = 888.105410, b = 152.558316\n",
      "epoch 1376: loss = 1723408.126347, a = 888.226018, b = 152.558239\n",
      "epoch 1377: loss = 1723393.376828, a = 888.346385, b = 152.558162\n",
      "epoch 1378: loss = 1723378.685697, a = 888.466511, b = 152.558085\n",
      "epoch 1379: loss = 1723364.052724, a = 888.586397, b = 152.558009\n",
      "epoch 1380: loss = 1723349.477675, a = 888.706043, b = 152.557932\n",
      "epoch 1381: loss = 1723334.960322, a = 888.825451, b = 152.557856\n",
      "epoch 1382: loss = 1723320.500434, a = 888.944619, b = 152.557780\n",
      "epoch 1383: loss = 1723306.097784, a = 889.063549, b = 152.557704\n",
      "epoch 1384: loss = 1723291.752143, a = 889.182241, b = 152.557628\n",
      "epoch 1385: loss = 1723277.463285, a = 889.300696, b = 152.557553\n",
      "epoch 1386: loss = 1723263.230984, a = 889.418914, b = 152.557477\n",
      "epoch 1387: loss = 1723249.055015, a = 889.536895, b = 152.557402\n",
      "epoch 1388: loss = 1723234.935154, a = 889.654641, b = 152.557327\n",
      "epoch 1389: loss = 1723220.871178, a = 889.772151, b = 152.557252\n",
      "epoch 1390: loss = 1723206.862865, a = 889.889427, b = 152.557177\n",
      "epoch 1391: loss = 1723192.909994, a = 890.006467, b = 152.557102\n",
      "epoch 1392: loss = 1723179.012343, a = 890.123274, b = 152.557027\n",
      "epoch 1393: loss = 1723165.169694, a = 890.239847, b = 152.556953\n",
      "epoch 1394: loss = 1723151.381827, a = 890.356187, b = 152.556879\n",
      "epoch 1395: loss = 1723137.648526, a = 890.472294, b = 152.556804\n",
      "epoch 1396: loss = 1723123.969572, a = 890.588170, b = 152.556730\n",
      "epoch 1397: loss = 1723110.344750, a = 890.703813, b = 152.556656\n",
      "epoch 1398: loss = 1723096.773845, a = 890.819225, b = 152.556583\n",
      "epoch 1399: loss = 1723083.256642, a = 890.934407, b = 152.556509\n",
      "epoch 1400: loss = 1723069.792927, a = 891.049358, b = 152.556436\n",
      "epoch 1401: loss = 1723056.382489, a = 891.164079, b = 152.556363\n",
      "epoch 1402: loss = 1723043.025115, a = 891.278571, b = 152.556289\n",
      "epoch 1403: loss = 1723029.720594, a = 891.392834, b = 152.556216\n",
      "epoch 1404: loss = 1723016.468716, a = 891.506868, b = 152.556144\n",
      "epoch 1405: loss = 1723003.269272, a = 891.620675, b = 152.556071\n",
      "epoch 1406: loss = 1722990.122053, a = 891.734253, b = 152.555998\n",
      "epoch 1407: loss = 1722977.026852, a = 891.847605, b = 152.555926\n",
      "epoch 1408: loss = 1722963.983461, a = 891.960730, b = 152.555854\n",
      "epoch 1409: loss = 1722950.991676, a = 892.073629, b = 152.555782\n",
      "epoch 1410: loss = 1722938.051290, a = 892.186302, b = 152.555710\n",
      "epoch 1411: loss = 1722925.162100, a = 892.298750, b = 152.555638\n",
      "epoch 1412: loss = 1722912.323901, a = 892.410972, b = 152.555566\n",
      "epoch 1413: loss = 1722899.536492, a = 892.522971, b = 152.555495\n",
      "epoch 1414: loss = 1722886.799670, a = 892.634745, b = 152.555423\n",
      "epoch 1415: loss = 1722874.113234, a = 892.746296, b = 152.555352\n",
      "epoch 1416: loss = 1722861.476984, a = 892.857624, b = 152.555281\n",
      "epoch 1417: loss = 1722848.890720, a = 892.968730, b = 152.555210\n",
      "epoch 1418: loss = 1722836.354243, a = 893.079613, b = 152.555139\n",
      "epoch 1419: loss = 1722823.867356, a = 893.190274, b = 152.555068\n",
      "epoch 1420: loss = 1722811.429862, a = 893.300714, b = 152.554998\n",
      "epoch 1421: loss = 1722799.041564, a = 893.410934, b = 152.554927\n",
      "epoch 1422: loss = 1722786.702267, a = 893.520932, b = 152.554857\n",
      "epoch 1423: loss = 1722774.411775, a = 893.630711, b = 152.554787\n",
      "epoch 1424: loss = 1722762.169895, a = 893.740271, b = 152.554717\n",
      "epoch 1425: loss = 1722749.976434, a = 893.849611, b = 152.554647\n",
      "epoch 1426: loss = 1722737.831199, a = 893.958733, b = 152.554578\n",
      "epoch 1427: loss = 1722725.733998, a = 894.067636, b = 152.554508\n",
      "epoch 1428: loss = 1722713.684641, a = 894.176322, b = 152.554439\n",
      "epoch 1429: loss = 1722701.682937, a = 894.284790, b = 152.554369\n",
      "epoch 1430: loss = 1722689.728697, a = 894.393042, b = 152.554300\n",
      "epoch 1431: loss = 1722677.821732, a = 894.501077, b = 152.554231\n",
      "epoch 1432: loss = 1722665.961855, a = 894.608895, b = 152.554162\n",
      "epoch 1433: loss = 1722654.148878, a = 894.716499, b = 152.554094\n",
      "epoch 1434: loss = 1722642.382614, a = 894.823887, b = 152.554025\n",
      "epoch 1435: loss = 1722630.662879, a = 894.931060, b = 152.553957\n",
      "epoch 1436: loss = 1722618.989486, a = 895.038020, b = 152.553888\n",
      "epoch 1437: loss = 1722607.362253, a = 895.144765, b = 152.553820\n",
      "epoch 1438: loss = 1722595.780995, a = 895.251297, b = 152.553752\n",
      "epoch 1439: loss = 1722584.245530, a = 895.357615, b = 152.553684\n",
      "epoch 1440: loss = 1722572.755676, a = 895.463721, b = 152.553616\n",
      "epoch 1441: loss = 1722561.311251, a = 895.569615, b = 152.553549\n",
      "epoch 1442: loss = 1722549.912075, a = 895.675298, b = 152.553481\n",
      "epoch 1443: loss = 1722538.557968, a = 895.780769, b = 152.553414\n",
      "epoch 1444: loss = 1722527.248752, a = 895.886029, b = 152.553347\n",
      "epoch 1445: loss = 1722515.984246, a = 895.991078, b = 152.553280\n",
      "epoch 1446: loss = 1722504.764275, a = 896.095917, b = 152.553213\n",
      "epoch 1447: loss = 1722493.588661, a = 896.200547, b = 152.553146\n",
      "epoch 1448: loss = 1722482.457227, a = 896.304968, b = 152.553079\n",
      "epoch 1449: loss = 1722471.369798, a = 896.409180, b = 152.553012\n",
      "epoch 1450: loss = 1722460.326199, a = 896.513183, b = 152.552946\n",
      "epoch 1451: loss = 1722449.326257, a = 896.616978, b = 152.552880\n",
      "epoch 1452: loss = 1722438.369797, a = 896.720566, b = 152.552814\n",
      "epoch 1453: loss = 1722427.456646, a = 896.823947, b = 152.552748\n",
      "epoch 1454: loss = 1722416.586633, a = 896.927121, b = 152.552682\n",
      "epoch 1455: loss = 1722405.759587, a = 897.030088, b = 152.552616\n",
      "epoch 1456: loss = 1722394.975336, a = 897.132850, b = 152.552550\n",
      "epoch 1457: loss = 1722384.233710, a = 897.235407, b = 152.552485\n",
      "epoch 1458: loss = 1722373.534540, a = 897.337758, b = 152.552419\n",
      "epoch 1459: loss = 1722362.877657, a = 897.439904, b = 152.552354\n",
      "epoch 1460: loss = 1722352.262894, a = 897.541846, b = 152.552289\n",
      "epoch 1461: loss = 1722341.690083, a = 897.643585, b = 152.552224\n",
      "epoch 1462: loss = 1722331.159057, a = 897.745120, b = 152.552159\n",
      "epoch 1463: loss = 1722320.669650, a = 897.846452, b = 152.552095\n",
      "epoch 1464: loss = 1722310.221696, a = 897.947581, b = 152.552030\n",
      "epoch 1465: loss = 1722299.815032, a = 898.048508, b = 152.551965\n",
      "epoch 1466: loss = 1722289.449493, a = 898.149233, b = 152.551901\n",
      "epoch 1467: loss = 1722279.124916, a = 898.249757, b = 152.551837\n",
      "epoch 1468: loss = 1722268.841137, a = 898.350080, b = 152.551773\n",
      "epoch 1469: loss = 1722258.597995, a = 898.450202, b = 152.551709\n",
      "epoch 1470: loss = 1722248.395329, a = 898.550124, b = 152.551645\n",
      "epoch 1471: loss = 1722238.232977, a = 898.649846, b = 152.551581\n",
      "epoch 1472: loss = 1722228.110779, a = 898.749369, b = 152.551518\n",
      "epoch 1473: loss = 1722218.028576, a = 898.848693, b = 152.551454\n",
      "epoch 1474: loss = 1722207.986209, a = 898.947818, b = 152.551391\n",
      "epoch 1475: loss = 1722197.983520, a = 899.046745, b = 152.551328\n",
      "epoch 1476: loss = 1722188.020350, a = 899.145474, b = 152.551265\n",
      "epoch 1477: loss = 1722178.096544, a = 899.244006, b = 152.551202\n",
      "epoch 1478: loss = 1722168.211944, a = 899.342341, b = 152.551139\n",
      "epoch 1479: loss = 1722158.366395, a = 899.440479, b = 152.551076\n",
      "epoch 1480: loss = 1722148.559742, a = 899.538420, b = 152.551014\n",
      "epoch 1481: loss = 1722138.791830, a = 899.636166, b = 152.550951\n",
      "epoch 1482: loss = 1722129.062505, a = 899.733717, b = 152.550889\n",
      "epoch 1483: loss = 1722119.371614, a = 899.831072, b = 152.550827\n",
      "epoch 1484: loss = 1722109.719005, a = 899.928233, b = 152.550765\n",
      "epoch 1485: loss = 1722100.104525, a = 900.025199, b = 152.550703\n",
      "epoch 1486: loss = 1722090.528022, a = 900.121972, b = 152.550641\n",
      "epoch 1487: loss = 1722080.989347, a = 900.218551, b = 152.550579\n",
      "epoch 1488: loss = 1722071.488348, a = 900.314937, b = 152.550518\n",
      "epoch 1489: loss = 1722062.024876, a = 900.411130, b = 152.550456\n",
      "epoch 1490: loss = 1722052.598782, a = 900.507131, b = 152.550395\n",
      "epoch 1491: loss = 1722043.209917, a = 900.602939, b = 152.550334\n",
      "epoch 1492: loss = 1722033.858134, a = 900.698557, b = 152.550273\n",
      "epoch 1493: loss = 1722024.543285, a = 900.793983, b = 152.550212\n",
      "epoch 1494: loss = 1722015.265224, a = 900.889218, b = 152.550151\n",
      "epoch 1495: loss = 1722006.023804, a = 900.984263, b = 152.550090\n",
      "epoch 1496: loss = 1721996.818880, a = 901.079117, b = 152.550030\n",
      "epoch 1497: loss = 1721987.650307, a = 901.173782, b = 152.549969\n",
      "epoch 1498: loss = 1721978.517941, a = 901.268258, b = 152.549909\n",
      "epoch 1499: loss = 1721969.421637, a = 901.362545, b = 152.549849\n",
      "epoch 1500: loss = 1721960.361253, a = 901.456643, b = 152.549789\n",
      "epoch 1501: loss = 1721951.336645, a = 901.550553, b = 152.549729\n",
      "epoch 1502: loss = 1721942.347673, a = 901.644276, b = 152.549669\n",
      "epoch 1503: loss = 1721933.394193, a = 901.737811, b = 152.549609\n",
      "epoch 1504: loss = 1721924.476066, a = 901.831159, b = 152.549549\n",
      "epoch 1505: loss = 1721915.593151, a = 901.924320, b = 152.549490\n",
      "epoch 1506: loss = 1721906.745308, a = 902.017295, b = 152.549431\n",
      "epoch 1507: loss = 1721897.932397, a = 902.110084, b = 152.549371\n",
      "epoch 1508: loss = 1721889.154280, a = 902.202687, b = 152.549312\n",
      "epoch 1509: loss = 1721880.410820, a = 902.295105, b = 152.549253\n",
      "epoch 1510: loss = 1721871.701877, a = 902.387339, b = 152.549194\n",
      "epoch 1511: loss = 1721863.027315, a = 902.479388, b = 152.549135\n",
      "epoch 1512: loss = 1721854.386998, a = 902.571253, b = 152.549077\n",
      "epoch 1513: loss = 1721845.780790, a = 902.662934, b = 152.549018\n",
      "epoch 1514: loss = 1721837.208555, a = 902.754432, b = 152.548960\n",
      "epoch 1515: loss = 1721828.670157, a = 902.845747, b = 152.548901\n",
      "epoch 1516: loss = 1721820.165464, a = 902.936879, b = 152.548843\n",
      "epoch 1517: loss = 1721811.694341, a = 903.027829, b = 152.548785\n",
      "epoch 1518: loss = 1721803.256654, a = 903.118598, b = 152.548727\n",
      "epoch 1519: loss = 1721794.852271, a = 903.209184, b = 152.548669\n",
      "epoch 1520: loss = 1721786.481060, a = 903.299590, b = 152.548612\n",
      "epoch 1521: loss = 1721778.142889, a = 903.389815, b = 152.548554\n",
      "epoch 1522: loss = 1721769.837627, a = 903.479859, b = 152.548496\n",
      "epoch 1523: loss = 1721761.565142, a = 903.569724, b = 152.548439\n",
      "epoch 1524: loss = 1721753.325306, a = 903.659408, b = 152.548382\n",
      "epoch 1525: loss = 1721745.117988, a = 903.748914, b = 152.548325\n",
      "epoch 1526: loss = 1721736.943059, a = 903.838240, b = 152.548268\n",
      "epoch 1527: loss = 1721728.800390, a = 903.927388, b = 152.548211\n",
      "epoch 1528: loss = 1721720.689854, a = 904.016357, b = 152.548154\n",
      "epoch 1529: loss = 1721712.611323, a = 904.105149, b = 152.548097\n",
      "epoch 1530: loss = 1721704.564670, a = 904.193763, b = 152.548041\n",
      "epoch 1531: loss = 1721696.549768, a = 904.282199, b = 152.547984\n",
      "epoch 1532: loss = 1721688.566492, a = 904.370459, b = 152.547928\n",
      "epoch 1533: loss = 1721680.614715, a = 904.458543, b = 152.547871\n",
      "epoch 1534: loss = 1721672.694312, a = 904.546450, b = 152.547815\n",
      "epoch 1535: loss = 1721664.805160, a = 904.634182, b = 152.547759\n",
      "epoch 1536: loss = 1721656.947133, a = 904.721738, b = 152.547703\n",
      "epoch 1537: loss = 1721649.120109, a = 904.809119, b = 152.547647\n",
      "epoch 1538: loss = 1721641.323964, a = 904.896325, b = 152.547592\n",
      "epoch 1539: loss = 1721633.558576, a = 904.983357, b = 152.547536\n",
      "epoch 1540: loss = 1721625.823823, a = 905.070215, b = 152.547481\n",
      "epoch 1541: loss = 1721618.119582, a = 905.156899, b = 152.547425\n",
      "epoch 1542: loss = 1721610.445734, a = 905.243410, b = 152.547370\n",
      "epoch 1543: loss = 1721602.802156, a = 905.329748, b = 152.547315\n",
      "epoch 1544: loss = 1721595.188730, a = 905.415913, b = 152.547260\n",
      "epoch 1545: loss = 1721587.605335, a = 905.501906, b = 152.547205\n",
      "epoch 1546: loss = 1721580.051852, a = 905.587727, b = 152.547150\n",
      "epoch 1547: loss = 1721572.528163, a = 905.673376, b = 152.547095\n",
      "epoch 1548: loss = 1721565.034149, a = 905.758854, b = 152.547041\n",
      "epoch 1549: loss = 1721557.569692, a = 905.844161, b = 152.546986\n",
      "epoch 1550: loss = 1721550.134675, a = 905.929298, b = 152.546932\n",
      "epoch 1551: loss = 1721542.728982, a = 906.014264, b = 152.546878\n",
      "epoch 1552: loss = 1721535.352495, a = 906.099060, b = 152.546824\n",
      "epoch 1553: loss = 1721528.005099, a = 906.183687, b = 152.546770\n",
      "epoch 1554: loss = 1721520.686678, a = 906.268145, b = 152.546716\n",
      "epoch 1555: loss = 1721513.397118, a = 906.352433, b = 152.546662\n",
      "epoch 1556: loss = 1721506.136304, a = 906.436553, b = 152.546608\n",
      "epoch 1557: loss = 1721498.904121, a = 906.520505, b = 152.546554\n",
      "epoch 1558: loss = 1721491.700457, a = 906.604289, b = 152.546501\n",
      "epoch 1559: loss = 1721484.525197, a = 906.687906, b = 152.546448\n",
      "epoch 1560: loss = 1721477.378230, a = 906.771355, b = 152.546394\n",
      "epoch 1561: loss = 1721470.259443, a = 906.854638, b = 152.546341\n",
      "epoch 1562: loss = 1721463.168723, a = 906.937754, b = 152.546288\n",
      "epoch 1563: loss = 1721456.105960, a = 907.020703, b = 152.546235\n",
      "epoch 1564: loss = 1721449.071043, a = 907.103487, b = 152.546182\n",
      "epoch 1565: loss = 1721442.063862, a = 907.186106, b = 152.546129\n",
      "epoch 1566: loss = 1721435.084305, a = 907.268559, b = 152.546077\n",
      "epoch 1567: loss = 1721428.132264, a = 907.350847, b = 152.546024\n",
      "epoch 1568: loss = 1721421.207629, a = 907.432970, b = 152.545972\n",
      "epoch 1569: loss = 1721414.310292, a = 907.514930, b = 152.545919\n",
      "epoch 1570: loss = 1721407.440144, a = 907.596725, b = 152.545867\n",
      "epoch 1571: loss = 1721400.597077, a = 907.678357, b = 152.545815\n",
      "epoch 1572: loss = 1721393.780984, a = 907.759826, b = 152.545763\n",
      "epoch 1573: loss = 1721386.991758, a = 907.841132, b = 152.545711\n",
      "epoch 1574: loss = 1721380.229293, a = 907.922275, b = 152.545659\n",
      "epoch 1575: loss = 1721373.493481, a = 908.003256, b = 152.545607\n",
      "epoch 1576: loss = 1721366.784218, a = 908.084075, b = 152.545556\n",
      "epoch 1577: loss = 1721360.101397, a = 908.164733, b = 152.545504\n",
      "epoch 1578: loss = 1721353.444915, a = 908.245229, b = 152.545453\n",
      "epoch 1579: loss = 1721346.814666, a = 908.325564, b = 152.545402\n",
      "epoch 1580: loss = 1721340.210546, a = 908.405739, b = 152.545350\n",
      "epoch 1581: loss = 1721333.632452, a = 908.485753, b = 152.545299\n",
      "epoch 1582: loss = 1721327.080281, a = 908.565607, b = 152.545248\n",
      "epoch 1583: loss = 1721320.553929, a = 908.645302, b = 152.545197\n",
      "epoch 1584: loss = 1721314.053295, a = 908.724837, b = 152.545147\n",
      "epoch 1585: loss = 1721307.578275, a = 908.804213, b = 152.545096\n",
      "epoch 1586: loss = 1721301.128770, a = 908.883430, b = 152.545045\n",
      "epoch 1587: loss = 1721294.704676, a = 908.962489, b = 152.544995\n",
      "epoch 1588: loss = 1721288.305894, a = 909.041390, b = 152.544944\n",
      "epoch 1589: loss = 1721281.932323, a = 909.120133, b = 152.544894\n",
      "epoch 1590: loss = 1721275.583863, a = 909.198719, b = 152.544844\n",
      "epoch 1591: loss = 1721269.260415, a = 909.277148, b = 152.544794\n",
      "epoch 1592: loss = 1721262.961879, a = 909.355419, b = 152.544744\n",
      "epoch 1593: loss = 1721256.688156, a = 909.433534, b = 152.544694\n",
      "epoch 1594: loss = 1721250.439148, a = 909.511493, b = 152.544644\n",
      "epoch 1595: loss = 1721244.214757, a = 909.589296, b = 152.544594\n",
      "epoch 1596: loss = 1721238.014885, a = 909.666944, b = 152.544545\n",
      "epoch 1597: loss = 1721231.839435, a = 909.744436, b = 152.544495\n",
      "epoch 1598: loss = 1721225.688310, a = 909.821773, b = 152.544446\n",
      "epoch 1599: loss = 1721219.561414, a = 909.898956, b = 152.544397\n",
      "epoch 1600: loss = 1721213.458651, a = 909.975984, b = 152.544347\n",
      "epoch 1601: loss = 1721207.379924, a = 910.052859, b = 152.544298\n",
      "epoch 1602: loss = 1721201.325138, a = 910.129579, b = 152.544249\n",
      "epoch 1603: loss = 1721195.294200, a = 910.206146, b = 152.544200\n",
      "epoch 1604: loss = 1721189.287013, a = 910.282560, b = 152.544152\n",
      "epoch 1605: loss = 1721183.303483, a = 910.358821, b = 152.544103\n",
      "epoch 1606: loss = 1721177.343518, a = 910.434930, b = 152.544054\n",
      "epoch 1607: loss = 1721171.407023, a = 910.510887, b = 152.544006\n",
      "epoch 1608: loss = 1721165.493905, a = 910.586691, b = 152.543957\n",
      "epoch 1609: loss = 1721159.604072, a = 910.662344, b = 152.543909\n",
      "epoch 1610: loss = 1721153.737431, a = 910.737846, b = 152.543861\n",
      "epoch 1611: loss = 1721147.893890, a = 910.813197, b = 152.543813\n",
      "epoch 1612: loss = 1721142.073358, a = 910.888397, b = 152.543765\n",
      "epoch 1613: loss = 1721136.275743, a = 910.963447, b = 152.543717\n",
      "epoch 1614: loss = 1721130.500955, a = 911.038346, b = 152.543669\n",
      "epoch 1615: loss = 1721124.748902, a = 911.113096, b = 152.543621\n",
      "epoch 1616: loss = 1721119.019496, a = 911.187697, b = 152.543574\n",
      "epoch 1617: loss = 1721113.312646, a = 911.262148, b = 152.543526\n",
      "epoch 1618: loss = 1721107.628262, a = 911.336450, b = 152.543478\n",
      "epoch 1619: loss = 1721101.966255, a = 911.410604, b = 152.543431\n",
      "epoch 1620: loss = 1721096.326537, a = 911.484609, b = 152.543384\n",
      "epoch 1621: loss = 1721090.709020, a = 911.558467, b = 152.543337\n",
      "epoch 1622: loss = 1721085.113615, a = 911.632177, b = 152.543290\n",
      "epoch 1623: loss = 1721079.540234, a = 911.705739, b = 152.543243\n",
      "epoch 1624: loss = 1721073.988791, a = 911.779154, b = 152.543196\n",
      "epoch 1625: loss = 1721068.459198, a = 911.852423, b = 152.543149\n",
      "epoch 1626: loss = 1721062.951369, a = 911.925545, b = 152.543102\n",
      "epoch 1627: loss = 1721057.465217, a = 911.998521, b = 152.543056\n",
      "epoch 1628: loss = 1721052.000656, a = 912.071351, b = 152.543009\n",
      "epoch 1629: loss = 1721046.557601, a = 912.144035, b = 152.542963\n",
      "epoch 1630: loss = 1721041.135967, a = 912.216574, b = 152.542916\n",
      "epoch 1631: loss = 1721035.735668, a = 912.288967, b = 152.542870\n",
      "epoch 1632: loss = 1721030.356621, a = 912.361217, b = 152.542824\n",
      "epoch 1633: loss = 1721024.998740, a = 912.433321, b = 152.542778\n",
      "epoch 1634: loss = 1721019.661942, a = 912.505281, b = 152.542732\n",
      "epoch 1635: loss = 1721014.346143, a = 912.577098, b = 152.542686\n",
      "epoch 1636: loss = 1721009.051260, a = 912.648771, b = 152.542640\n",
      "epoch 1637: loss = 1721003.777210, a = 912.720300, b = 152.542595\n",
      "epoch 1638: loss = 1720998.523911, a = 912.791687, b = 152.542549\n",
      "epoch 1639: loss = 1720993.291280, a = 912.862931, b = 152.542504\n",
      "epoch 1640: loss = 1720988.079235, a = 912.934032, b = 152.542458\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch 1641: loss = 1720982.887695, a = 913.004991, b = 152.542413\n",
      "epoch 1642: loss = 1720977.716578, a = 913.075808, b = 152.542368\n",
      "epoch 1643: loss = 1720972.565804, a = 913.146484, b = 152.542322\n",
      "epoch 1644: loss = 1720967.435291, a = 913.217018, b = 152.542277\n",
      "epoch 1645: loss = 1720962.324960, a = 913.287412, b = 152.542232\n",
      "epoch 1646: loss = 1720957.234731, a = 913.357664, b = 152.542188\n",
      "epoch 1647: loss = 1720952.164523, a = 913.427776, b = 152.542143\n",
      "epoch 1648: loss = 1720947.114257, a = 913.497748, b = 152.542098\n",
      "epoch 1649: loss = 1720942.083855, a = 913.567580, b = 152.542053\n",
      "epoch 1650: loss = 1720937.073238, a = 913.637272, b = 152.542009\n",
      "epoch 1651: loss = 1720932.082327, a = 913.706825, b = 152.541965\n",
      "epoch 1652: loss = 1720927.111044, a = 913.776239, b = 152.541920\n",
      "epoch 1653: loss = 1720922.159311, a = 913.845514, b = 152.541876\n",
      "epoch 1654: loss = 1720917.227051, a = 913.914650, b = 152.541832\n",
      "epoch 1655: loss = 1720912.314187, a = 913.983648, b = 152.541788\n",
      "epoch 1656: loss = 1720907.420641, a = 914.052509, b = 152.541744\n",
      "epoch 1657: loss = 1720902.546338, a = 914.121231, b = 152.541700\n",
      "epoch 1658: loss = 1720897.691201, a = 914.189816, b = 152.541656\n",
      "epoch 1659: loss = 1720892.855154, a = 914.258264, b = 152.541612\n",
      "epoch 1660: loss = 1720888.038121, a = 914.326575, b = 152.541569\n",
      "epoch 1661: loss = 1720883.240027, a = 914.394750, b = 152.541525\n",
      "epoch 1662: loss = 1720878.460797, a = 914.462788, b = 152.541482\n",
      "epoch 1663: loss = 1720873.700356, a = 914.530690, b = 152.541438\n",
      "epoch 1664: loss = 1720868.958630, a = 914.598457, b = 152.541395\n",
      "epoch 1665: loss = 1720864.235544, a = 914.666087, b = 152.541352\n",
      "epoch 1666: loss = 1720859.531025, a = 914.733583, b = 152.541309\n",
      "epoch 1667: loss = 1720854.845000, a = 914.800944, b = 152.541266\n",
      "epoch 1668: loss = 1720850.177394, a = 914.868170, b = 152.541223\n",
      "epoch 1669: loss = 1720845.528135, a = 914.935261, b = 152.541180\n",
      "epoch 1670: loss = 1720840.897150, a = 915.002218, b = 152.541137\n",
      "epoch 1671: loss = 1720836.284366, a = 915.069042, b = 152.541095\n",
      "epoch 1672: loss = 1720831.689713, a = 915.135732, b = 152.541052\n",
      "epoch 1673: loss = 1720827.113117, a = 915.202288, b = 152.541009\n",
      "epoch 1674: loss = 1720822.554508, a = 915.268712, b = 152.540967\n",
      "epoch 1675: loss = 1720818.013813, a = 915.335002, b = 152.540925\n",
      "epoch 1676: loss = 1720813.490962, a = 915.401160, b = 152.540882\n",
      "epoch 1677: loss = 1720808.985885, a = 915.467186, b = 152.540840\n",
      "epoch 1678: loss = 1720804.498511, a = 915.533079, b = 152.540798\n",
      "epoch 1679: loss = 1720800.028769, a = 915.598841, b = 152.540756\n",
      "epoch 1680: loss = 1720795.576590, a = 915.664472, b = 152.540714\n",
      "epoch 1681: loss = 1720791.141905, a = 915.729971, b = 152.540672\n",
      "epoch 1682: loss = 1720786.724644, a = 915.795339, b = 152.540631\n",
      "epoch 1683: loss = 1720782.324737, a = 915.860577, b = 152.540589\n",
      "epoch 1684: loss = 1720777.942117, a = 915.925684, b = 152.540547\n",
      "epoch 1685: loss = 1720773.576714, a = 915.990660, b = 152.540506\n",
      "epoch 1686: loss = 1720769.228461, a = 916.055507, b = 152.540464\n",
      "epoch 1687: loss = 1720764.897290, a = 916.120224, b = 152.540423\n",
      "epoch 1688: loss = 1720760.583133, a = 916.184812, b = 152.540382\n",
      "epoch 1689: loss = 1720756.285922, a = 916.249271, b = 152.540341\n",
      "epoch 1690: loss = 1720752.005590, a = 916.313601, b = 152.540300\n",
      "epoch 1691: loss = 1720747.742072, a = 916.377802, b = 152.540259\n",
      "epoch 1692: loss = 1720743.495299, a = 916.441875, b = 152.540218\n",
      "epoch 1693: loss = 1720739.265205, a = 916.505819, b = 152.540177\n",
      "epoch 1694: loss = 1720735.051726, a = 916.569636, b = 152.540136\n",
      "epoch 1695: loss = 1720730.854794, a = 916.633325, b = 152.540095\n",
      "epoch 1696: loss = 1720726.674344, a = 916.696887, b = 152.540055\n",
      "epoch 1697: loss = 1720722.510311, a = 916.760321, b = 152.540014\n",
      "epoch 1698: loss = 1720718.362630, a = 916.823629, b = 152.539974\n",
      "epoch 1699: loss = 1720714.231237, a = 916.886810, b = 152.539934\n",
      "epoch 1700: loss = 1720710.116066, a = 916.949865, b = 152.539893\n",
      "epoch 1701: loss = 1720706.017053, a = 917.012794, b = 152.539853\n",
      "epoch 1702: loss = 1720701.934135, a = 917.075597, b = 152.539813\n",
      "epoch 1703: loss = 1720697.867247, a = 917.138274, b = 152.539773\n",
      "epoch 1704: loss = 1720693.816327, a = 917.200827, b = 152.539733\n",
      "epoch 1705: loss = 1720689.781311, a = 917.263253, b = 152.539693\n",
      "epoch 1706: loss = 1720685.762135, a = 917.325556, b = 152.539653\n",
      "epoch 1707: loss = 1720681.758738, a = 917.387733, b = 152.539614\n",
      "epoch 1708: loss = 1720677.771057, a = 917.449786, b = 152.539574\n",
      "epoch 1709: loss = 1720673.799029, a = 917.511715, b = 152.539534\n",
      "epoch 1710: loss = 1720669.842593, a = 917.573521, b = 152.539495\n",
      "epoch 1711: loss = 1720665.901687, a = 917.635202, b = 152.539456\n",
      "epoch 1712: loss = 1720661.976249, a = 917.696761, b = 152.539416\n",
      "epoch 1713: loss = 1720658.066218, a = 917.758196, b = 152.539377\n",
      "epoch 1714: loss = 1720654.171533, a = 917.819508, b = 152.539338\n",
      "epoch 1715: loss = 1720650.292133, a = 917.880698, b = 152.539299\n",
      "epoch 1716: loss = 1720646.427958, a = 917.941766, b = 152.539260\n",
      "epoch 1717: loss = 1720642.578948, a = 918.002711, b = 152.539221\n",
      "epoch 1718: loss = 1720638.745042, a = 918.063534, b = 152.539182\n",
      "epoch 1719: loss = 1720634.926181, a = 918.124236, b = 152.539143\n",
      "epoch 1720: loss = 1720631.122305, a = 918.184817, b = 152.539104\n",
      "epoch 1721: loss = 1720627.333355, a = 918.245276, b = 152.539066\n",
      "epoch 1722: loss = 1720623.559271, a = 918.305614, b = 152.539027\n",
      "epoch 1723: loss = 1720619.799996, a = 918.365832, b = 152.538989\n",
      "epoch 1724: loss = 1720616.055469, a = 918.425930, b = 152.538950\n",
      "epoch 1725: loss = 1720612.325634, a = 918.485907, b = 152.538912\n",
      "epoch 1726: loss = 1720608.610431, a = 918.545764, b = 152.538874\n",
      "epoch 1727: loss = 1720604.909803, a = 918.605501, b = 152.538836\n",
      "epoch 1728: loss = 1720601.223691, a = 918.665120, b = 152.538798\n",
      "epoch 1729: loss = 1720597.552040, a = 918.724618, b = 152.538760\n",
      "epoch 1730: loss = 1720593.894791, a = 918.783998, b = 152.538722\n",
      "epoch 1731: loss = 1720590.251887, a = 918.843259, b = 152.538684\n",
      "epoch 1732: loss = 1720586.623272, a = 918.902402, b = 152.538646\n",
      "epoch 1733: loss = 1720583.008889, a = 918.961426, b = 152.538608\n",
      "epoch 1734: loss = 1720579.408681, a = 919.020333, b = 152.538571\n",
      "epoch 1735: loss = 1720575.822593, a = 919.079121, b = 152.538533\n",
      "epoch 1736: loss = 1720572.250569, a = 919.137792, b = 152.538496\n",
      "epoch 1737: loss = 1720568.692553, a = 919.196346, b = 152.538458\n",
      "epoch 1738: loss = 1720565.148489, a = 919.254783, b = 152.538421\n",
      "epoch 1739: loss = 1720561.618323, a = 919.313102, b = 152.538384\n",
      "epoch 1740: loss = 1720558.101999, a = 919.371305, b = 152.538347\n",
      "epoch 1741: loss = 1720554.599463, a = 919.429392, b = 152.538310\n",
      "epoch 1742: loss = 1720551.110660, a = 919.487363, b = 152.538273\n",
      "epoch 1743: loss = 1720547.635535, a = 919.545217, b = 152.538236\n",
      "epoch 1744: loss = 1720544.174035, a = 919.602956, b = 152.538199\n",
      "epoch 1745: loss = 1720540.726106, a = 919.660580, b = 152.538162\n",
      "epoch 1746: loss = 1720537.291694, a = 919.718088, b = 152.538125\n",
      "epoch 1747: loss = 1720533.870745, a = 919.775481, b = 152.538089\n",
      "epoch 1748: loss = 1720530.463206, a = 919.832760, b = 152.538052\n",
      "epoch 1749: loss = 1720527.069024, a = 919.889924, b = 152.538015\n",
      "epoch 1750: loss = 1720523.688147, a = 919.946973, b = 152.537979\n",
      "epoch 1751: loss = 1720520.320521, a = 920.003909, b = 152.537943\n",
      "epoch 1752: loss = 1720516.966095, a = 920.060731, b = 152.537906\n",
      "epoch 1753: loss = 1720513.624815, a = 920.117439, b = 152.537870\n",
      "epoch 1754: loss = 1720510.296631, a = 920.174033, b = 152.537834\n",
      "epoch 1755: loss = 1720506.981489, a = 920.230515, b = 152.537798\n",
      "epoch 1756: loss = 1720503.679339, a = 920.286884, b = 152.537762\n",
      "epoch 1757: loss = 1720500.390129, a = 920.343139, b = 152.537726\n",
      "epoch 1758: loss = 1720497.113808, a = 920.399283, b = 152.537690\n",
      "epoch 1759: loss = 1720493.850325, a = 920.455314, b = 152.537654\n",
      "epoch 1760: loss = 1720490.599630, a = 920.511233, b = 152.537619\n",
      "epoch 1761: loss = 1720487.361670, a = 920.567040, b = 152.537583\n",
      "epoch 1762: loss = 1720484.136397, a = 920.622736, b = 152.537547\n",
      "epoch 1763: loss = 1720480.923760, a = 920.678320, b = 152.537512\n",
      "epoch 1764: loss = 1720477.723709, a = 920.733793, b = 152.537476\n",
      "epoch 1765: loss = 1720474.536195, a = 920.789155, b = 152.537441\n",
      "epoch 1766: loss = 1720471.361166, a = 920.844407, b = 152.537406\n",
      "epoch 1767: loss = 1720468.198576, a = 920.899548, b = 152.537371\n",
      "epoch 1768: loss = 1720465.048373, a = 920.954579, b = 152.537335\n",
      "epoch 1769: loss = 1720461.910509, a = 921.009499, b = 152.537300\n",
      "epoch 1770: loss = 1720458.784936, a = 921.064310, b = 152.537265\n",
      "epoch 1771: loss = 1720455.671604, a = 921.119011, b = 152.537230\n",
      "epoch 1772: loss = 1720452.570465, a = 921.173603, b = 152.537196\n",
      "epoch 1773: loss = 1720449.481472, a = 921.228086, b = 152.537161\n",
      "epoch 1774: loss = 1720446.404575, a = 921.282460, b = 152.537126\n",
      "epoch 1775: loss = 1720443.339727, a = 921.336725, b = 152.537091\n",
      "epoch 1776: loss = 1720440.286881, a = 921.390881, b = 152.537057\n",
      "epoch 1777: loss = 1720437.245989, a = 921.444930, b = 152.537022\n",
      "epoch 1778: loss = 1720434.217004, a = 921.498870, b = 152.536988\n",
      "epoch 1779: loss = 1720431.199878, a = 921.552702, b = 152.536953\n",
      "epoch 1780: loss = 1720428.194566, a = 921.606427, b = 152.536919\n",
      "epoch 1781: loss = 1720425.201019, a = 921.660044, b = 152.536885\n",
      "epoch 1782: loss = 1720422.219191, a = 921.713554, b = 152.536851\n",
      "epoch 1783: loss = 1720419.249037, a = 921.766957, b = 152.536817\n",
      "epoch 1784: loss = 1720416.290510, a = 921.820253, b = 152.536783\n",
      "epoch 1785: loss = 1720413.343564, a = 921.873443, b = 152.536749\n",
      "epoch 1786: loss = 1720410.408153, a = 921.926526, b = 152.536715\n",
      "epoch 1787: loss = 1720407.484232, a = 921.979503, b = 152.536681\n",
      "epoch 1788: loss = 1720404.571755, a = 922.032374, b = 152.536647\n",
      "epoch 1789: loss = 1720401.670677, a = 922.085140, b = 152.536613\n",
      "epoch 1790: loss = 1720398.780953, a = 922.137800, b = 152.536580\n",
      "epoch 1791: loss = 1720395.902538, a = 922.190354, b = 152.536546\n",
      "epoch 1792: loss = 1720393.035387, a = 922.242804, b = 152.536513\n",
      "epoch 1793: loss = 1720390.179456, a = 922.295149, b = 152.536479\n",
      "epoch 1794: loss = 1720387.334700, a = 922.347389, b = 152.536446\n",
      "epoch 1795: loss = 1720384.501075, a = 922.399524, b = 152.536413\n",
      "epoch 1796: loss = 1720381.678538, a = 922.451555, b = 152.536379\n",
      "epoch 1797: loss = 1720378.867044, a = 922.503483, b = 152.536346\n",
      "epoch 1798: loss = 1720376.066550, a = 922.555306, b = 152.536313\n",
      "epoch 1799: loss = 1720373.277012, a = 922.607026, b = 152.536280\n",
      "epoch 1800: loss = 1720370.498388, a = 922.658642, b = 152.536247\n",
      "epoch 1801: loss = 1720367.730632, a = 922.710155, b = 152.536214\n",
      "epoch 1802: loss = 1720364.973704, a = 922.761565, b = 152.536181\n",
      "epoch 1803: loss = 1720362.227560, a = 922.812873, b = 152.536149\n",
      "epoch 1804: loss = 1720359.492157, a = 922.864078, b = 152.536116\n",
      "epoch 1805: loss = 1720356.767453, a = 922.915180, b = 152.536083\n",
      "epoch 1806: loss = 1720354.053406, a = 922.966180, b = 152.536051\n",
      "epoch 1807: loss = 1720351.349974, a = 923.017078, b = 152.536018\n",
      "epoch 1808: loss = 1720348.657114, a = 923.067875, b = 152.535986\n",
      "epoch 1809: loss = 1720345.974785, a = 923.118569, b = 152.535953\n",
      "epoch 1810: loss = 1720343.302945, a = 923.169163, b = 152.535921\n",
      "epoch 1811: loss = 1720340.641553, a = 923.219655, b = 152.535889\n",
      "epoch 1812: loss = 1720337.990567, a = 923.270046, b = 152.535857\n",
      "epoch 1813: loss = 1720335.349947, a = 923.320337, b = 152.535824\n",
      "epoch 1814: loss = 1720332.719651, a = 923.370527, b = 152.535792\n",
      "epoch 1815: loss = 1720330.099638, a = 923.420616, b = 152.535760\n",
      "epoch 1816: loss = 1720327.489869, a = 923.470606, b = 152.535728\n",
      "epoch 1817: loss = 1720324.890302, a = 923.520495, b = 152.535697\n",
      "epoch 1818: loss = 1720322.300897, a = 923.570285, b = 152.535665\n",
      "epoch 1819: loss = 1720319.721615, a = 923.619975, b = 152.535633\n",
      "epoch 1820: loss = 1720317.152414, a = 923.669566, b = 152.535601\n",
      "epoch 1821: loss = 1720314.593256, a = 923.719058, b = 152.535570\n",
      "epoch 1822: loss = 1720312.044100, a = 923.768450, b = 152.535538\n",
      "epoch 1823: loss = 1720309.504906, a = 923.817744, b = 152.535507\n",
      "epoch 1824: loss = 1720306.975637, a = 923.866939, b = 152.535475\n",
      "epoch 1825: loss = 1720304.456252, a = 923.916036, b = 152.535444\n",
      "epoch 1826: loss = 1720301.946713, a = 923.965035, b = 152.535413\n",
      "epoch 1827: loss = 1720299.446979, a = 924.013936, b = 152.535381\n",
      "epoch 1828: loss = 1720296.957014, a = 924.062739, b = 152.535350\n",
      "epoch 1829: loss = 1720294.476778, a = 924.111444, b = 152.535319\n",
      "epoch 1830: loss = 1720292.006232, a = 924.160052, b = 152.535288\n",
      "epoch 1831: loss = 1720289.545339, a = 924.208563, b = 152.535257\n",
      "epoch 1832: loss = 1720287.094060, a = 924.256977, b = 152.535226\n",
      "epoch 1833: loss = 1720284.652358, a = 924.305294, b = 152.535195\n",
      "epoch 1834: loss = 1720282.220194, a = 924.353514, b = 152.535165\n",
      "epoch 1835: loss = 1720279.797531, a = 924.401638, b = 152.535134\n",
      "epoch 1836: loss = 1720277.384331, a = 924.449666, b = 152.535103\n",
      "epoch 1837: loss = 1720274.980557, a = 924.497598, b = 152.535073\n",
      "epoch 1838: loss = 1720272.586172, a = 924.545433, b = 152.535042\n",
      "epoch 1839: loss = 1720270.201138, a = 924.593174, b = 152.535011\n",
      "epoch 1840: loss = 1720267.825419, a = 924.640818, b = 152.534981\n",
      "epoch 1841: loss = 1720265.458978, a = 924.688368, b = 152.534951\n",
      "epoch 1842: loss = 1720263.101779, a = 924.735822, b = 152.534920\n",
      "epoch 1843: loss = 1720260.753784, a = 924.783182, b = 152.534890\n",
      "epoch 1844: loss = 1720258.414957, a = 924.830446, b = 152.534860\n",
      "epoch 1845: loss = 1720256.085263, a = 924.877617, b = 152.534830\n",
      "epoch 1846: loss = 1720253.764664, a = 924.924692, b = 152.534800\n",
      "epoch 1847: loss = 1720251.453126, a = 924.971674, b = 152.534770\n",
      "epoch 1848: loss = 1720249.150613, a = 925.018562, b = 152.534740\n",
      "epoch 1849: loss = 1720246.857088, a = 925.065356, b = 152.534710\n",
      "epoch 1850: loss = 1720244.572517, a = 925.112057, b = 152.534680\n",
      "epoch 1851: loss = 1720242.296863, a = 925.158664, b = 152.534650\n",
      "epoch 1852: loss = 1720240.030093, a = 925.205178, b = 152.534621\n",
      "epoch 1853: loss = 1720237.772169, a = 925.251599, b = 152.534591\n",
      "epoch 1854: loss = 1720235.523059, a = 925.297927, b = 152.534561\n",
      "epoch 1855: loss = 1720233.282727, a = 925.344162, b = 152.534532\n",
      "epoch 1856: loss = 1720231.051138, a = 925.390305, b = 152.534502\n",
      "epoch 1857: loss = 1720228.828258, a = 925.436356, b = 152.534473\n",
      "epoch 1858: loss = 1720226.614052, a = 925.482314, b = 152.534444\n",
      "epoch 1859: loss = 1720224.408486, a = 925.528181, b = 152.534414\n",
      "epoch 1860: loss = 1720222.211527, a = 925.573956, b = 152.534385\n",
      "epoch 1861: loss = 1720220.023139, a = 925.619640, b = 152.534356\n",
      "epoch 1862: loss = 1720217.843290, a = 925.665232, b = 152.534327\n",
      "epoch 1863: loss = 1720215.671945, a = 925.710733, b = 152.534298\n",
      "epoch 1864: loss = 1720213.509072, a = 925.756143, b = 152.534269\n",
      "epoch 1865: loss = 1720211.354635, a = 925.801462, b = 152.534240\n",
      "epoch 1866: loss = 1720209.208604, a = 925.846690, b = 152.534211\n",
      "epoch 1867: loss = 1720207.070943, a = 925.891828, b = 152.534182\n",
      "epoch 1868: loss = 1720204.941620, a = 925.936876, b = 152.534153\n",
      "epoch 1869: loss = 1720202.820602, a = 925.981834, b = 152.534125\n",
      "epoch 1870: loss = 1720200.707857, a = 926.026702, b = 152.534096\n",
      "epoch 1871: loss = 1720198.603351, a = 926.071480, b = 152.534067\n",
      "epoch 1872: loss = 1720196.507053, a = 926.116169, b = 152.534039\n",
      "epoch 1873: loss = 1720194.418929, a = 926.160768, b = 152.534010\n",
      "epoch 1874: loss = 1720192.338948, a = 926.205278, b = 152.533982\n",
      "epoch 1875: loss = 1720190.267077, a = 926.249699, b = 152.533953\n",
      "epoch 1876: loss = 1720188.203284, a = 926.294031, b = 152.533925\n",
      "epoch 1877: loss = 1720186.147538, a = 926.338275, b = 152.533897\n",
      "epoch 1878: loss = 1720184.099807, a = 926.382430, b = 152.533869\n",
      "epoch 1879: loss = 1720182.060059, a = 926.426497, b = 152.533841\n",
      "epoch 1880: loss = 1720180.028263, a = 926.470475, b = 152.533812\n",
      "epoch 1881: loss = 1720178.004387, a = 926.514366, b = 152.533784\n",
      "epoch 1882: loss = 1720175.988400, a = 926.558169, b = 152.533756\n",
      "epoch 1883: loss = 1720173.980271, a = 926.601884, b = 152.533729\n",
      "epoch 1884: loss = 1720171.979968, a = 926.645512, b = 152.533701\n",
      "epoch 1885: loss = 1720169.987462, a = 926.689053, b = 152.533673\n",
      "epoch 1886: loss = 1720168.002721, a = 926.732507, b = 152.533645\n",
      "epoch 1887: loss = 1720166.025715, a = 926.775873, b = 152.533617\n",
      "epoch 1888: loss = 1720164.056412, a = 926.819153, b = 152.533590\n",
      "epoch 1889: loss = 1720162.094784, a = 926.862347, b = 152.533562\n",
      "epoch 1890: loss = 1720160.140799, a = 926.905454, b = 152.533535\n",
      "epoch 1891: loss = 1720158.194427, a = 926.948475, b = 152.533507\n",
      "epoch 1892: loss = 1720156.255638, a = 926.991410, b = 152.533480\n",
      "epoch 1893: loss = 1720154.324403, a = 927.034259, b = 152.533452\n",
      "epoch 1894: loss = 1720152.400692, a = 927.077022, b = 152.533425\n",
      "epoch 1895: loss = 1720150.484474, a = 927.119700, b = 152.533398\n",
      "epoch 1896: loss = 1720148.575721, a = 927.162292, b = 152.533371\n",
      "epoch 1897: loss = 1720146.674402, a = 927.204800, b = 152.533343\n",
      "epoch 1898: loss = 1720144.780489, a = 927.247222, b = 152.533316\n",
      "epoch 1899: loss = 1720142.893953, a = 927.289560, b = 152.533289\n",
      "epoch 1900: loss = 1720141.014763, a = 927.331812, b = 152.533262\n",
      "epoch 1901: loss = 1720139.142892, a = 927.373981, b = 152.533235\n",
      "epoch 1902: loss = 1720137.278311, a = 927.416065, b = 152.533209\n",
      "epoch 1903: loss = 1720135.420990, a = 927.458065, b = 152.533182\n",
      "epoch 1904: loss = 1720133.570901, a = 927.499981, b = 152.533155\n",
      "epoch 1905: loss = 1720131.728016, a = 927.541813, b = 152.533128\n",
      "epoch 1906: loss = 1720129.892306, a = 927.583561, b = 152.533102\n",
      "epoch 1907: loss = 1720128.063742, a = 927.625226, b = 152.533075\n",
      "epoch 1908: loss = 1720126.242298, a = 927.666808, b = 152.533048\n",
      "epoch 1909: loss = 1720124.427944, a = 927.708306, b = 152.533022\n",
      "epoch 1910: loss = 1720122.620652, a = 927.749721, b = 152.532995\n",
      "epoch 1911: loss = 1720120.820396, a = 927.791054, b = 152.532969\n",
      "epoch 1912: loss = 1720119.027146, a = 927.832304, b = 152.532943\n",
      "epoch 1913: loss = 1720117.240876, a = 927.873472, b = 152.532916\n",
      "epoch 1914: loss = 1720115.461558, a = 927.914557, b = 152.532890\n",
      "epoch 1915: loss = 1720113.689165, a = 927.955560, b = 152.532864\n",
      "epoch 1916: loss = 1720111.923668, a = 927.996481, b = 152.532838\n",
      "epoch 1917: loss = 1720110.165042, a = 928.037320, b = 152.532812\n",
      "epoch 1918: loss = 1720108.413258, a = 928.078078, b = 152.532786\n",
      "epoch 1919: loss = 1720106.668291, a = 928.118754, b = 152.532760\n",
      "epoch 1920: loss = 1720104.930113, a = 928.159348, b = 152.532734\n",
      "epoch 1921: loss = 1720103.198697, a = 928.199862, b = 152.532708\n",
      "epoch 1922: loss = 1720101.474017, a = 928.240295, b = 152.532682\n",
      "epoch 1923: loss = 1720099.756046, a = 928.280646, b = 152.532656\n",
      "epoch 1924: loss = 1720098.044757, a = 928.320917, b = 152.532631\n",
      "epoch 1925: loss = 1720096.340125, a = 928.361108, b = 152.532605\n",
      "epoch 1926: loss = 1720094.642123, a = 928.401218, b = 152.532579\n",
      "epoch 1927: loss = 1720092.950726, a = 928.441248, b = 152.532554\n",
      "epoch 1928: loss = 1720091.265906, a = 928.481197, b = 152.532528\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch 1929: loss = 1720089.587638, a = 928.521067, b = 152.532503\n",
      "epoch 1930: loss = 1720087.915897, a = 928.560858, b = 152.532477\n",
      "epoch 1931: loss = 1720086.250656, a = 928.600568, b = 152.532452\n",
      "epoch 1932: loss = 1720084.591889, a = 928.640200, b = 152.532427\n",
      "epoch 1933: loss = 1720082.939573, a = 928.679752, b = 152.532401\n",
      "epoch 1934: loss = 1720081.293680, a = 928.719224, b = 152.532376\n",
      "epoch 1935: loss = 1720079.654186, a = 928.758618, b = 152.532351\n",
      "epoch 1936: loss = 1720078.021066, a = 928.797934, b = 152.532326\n",
      "epoch 1937: loss = 1720076.394293, a = 928.837170, b = 152.532301\n",
      "epoch 1938: loss = 1720074.773845, a = 928.876328, b = 152.532276\n",
      "epoch 1939: loss = 1720073.159694, a = 928.915408, b = 152.532251\n",
      "epoch 1940: loss = 1720071.551818, a = 928.954410, b = 152.532226\n",
      "epoch 1941: loss = 1720069.950190, a = 928.993333, b = 152.532201\n",
      "epoch 1942: loss = 1720068.354786, a = 929.032179, b = 152.532176\n",
      "epoch 1943: loss = 1720066.765582, a = 929.070948, b = 152.532152\n",
      "epoch 1944: loss = 1720065.182554, a = 929.109638, b = 152.532127\n",
      "epoch 1945: loss = 1720063.605677, a = 929.148251, b = 152.532102\n",
      "epoch 1946: loss = 1720062.034926, a = 929.186787, b = 152.532078\n",
      "epoch 1947: loss = 1720060.470278, a = 929.225246, b = 152.532053\n",
      "epoch 1948: loss = 1720058.911709, a = 929.263629, b = 152.532028\n",
      "epoch 1949: loss = 1720057.359194, a = 929.301934, b = 152.532004\n",
      "epoch 1950: loss = 1720055.812710, a = 929.340163, b = 152.531980\n",
      "epoch 1951: loss = 1720054.272234, a = 929.378315, b = 152.531955\n",
      "epoch 1952: loss = 1720052.737740, a = 929.416391, b = 152.531931\n",
      "epoch 1953: loss = 1720051.209207, a = 929.454391, b = 152.531907\n",
      "epoch 1954: loss = 1720049.686610, a = 929.492315, b = 152.531882\n",
      "epoch 1955: loss = 1720048.169926, a = 929.530163, b = 152.531858\n",
      "epoch 1956: loss = 1720046.659132, a = 929.567935, b = 152.531834\n",
      "epoch 1957: loss = 1720045.154204, a = 929.605632, b = 152.531810\n",
      "epoch 1958: loss = 1720043.655120, a = 929.643253, b = 152.531786\n",
      "epoch 1959: loss = 1720042.161857, a = 929.680800, b = 152.531762\n",
      "epoch 1960: loss = 1720040.674390, a = 929.718271, b = 152.531738\n",
      "epoch 1961: loss = 1720039.192699, a = 929.755667, b = 152.531714\n",
      "epoch 1962: loss = 1720037.716759, a = 929.792988, b = 152.531690\n",
      "epoch 1963: loss = 1720036.246549, a = 929.830235, b = 152.531667\n",
      "epoch 1964: loss = 1720034.782046, a = 929.867408, b = 152.531643\n",
      "epoch 1965: loss = 1720033.323226, a = 929.904506, b = 152.531619\n",
      "epoch 1966: loss = 1720031.870069, a = 929.941529, b = 152.531596\n",
      "epoch 1967: loss = 1720030.422552, a = 929.978479, b = 152.531572\n",
      "epoch 1968: loss = 1720028.980651, a = 930.015355, b = 152.531548\n",
      "epoch 1969: loss = 1720027.544347, a = 930.052157, b = 152.531525\n",
      "epoch 1970: loss = 1720026.113615, a = 930.088886, b = 152.531501\n",
      "epoch 1971: loss = 1720024.688435, a = 930.125541, b = 152.531478\n",
      "epoch 1972: loss = 1720023.268784, a = 930.162123, b = 152.531455\n",
      "epoch 1973: loss = 1720021.854641, a = 930.198631, b = 152.531431\n",
      "epoch 1974: loss = 1720020.445984, a = 930.235067, b = 152.531408\n",
      "epoch 1975: loss = 1720019.042792, a = 930.271430, b = 152.531385\n",
      "epoch 1976: loss = 1720017.645042, a = 930.307720, b = 152.531362\n",
      "epoch 1977: loss = 1720016.252715, a = 930.343937, b = 152.531338\n",
      "epoch 1978: loss = 1720014.865787, a = 930.380082, b = 152.531315\n",
      "epoch 1979: loss = 1720013.484238, a = 930.416155, b = 152.531292\n",
      "epoch 1980: loss = 1720012.108047, a = 930.452156, b = 152.531269\n",
      "epoch 1981: loss = 1720010.737193, a = 930.488085, b = 152.531246\n",
      "epoch 1982: loss = 1720009.371655, a = 930.523941, b = 152.531224\n",
      "epoch 1983: loss = 1720008.011411, a = 930.559727, b = 152.531201\n",
      "epoch 1984: loss = 1720006.656442, a = 930.595440, b = 152.531178\n",
      "epoch 1985: loss = 1720005.306725, a = 930.631082, b = 152.531155\n",
      "epoch 1986: loss = 1720003.962241, a = 930.666653, b = 152.531132\n",
      "epoch 1987: loss = 1720002.622969, a = 930.702153, b = 152.531110\n",
      "epoch 1988: loss = 1720001.288889, a = 930.737582, b = 152.531087\n",
      "epoch 1989: loss = 1719999.959979, a = 930.772940, b = 152.531064\n",
      "epoch 1990: loss = 1719998.636221, a = 930.808227, b = 152.531042\n",
      "epoch 1991: loss = 1719997.317593, a = 930.843444, b = 152.531019\n",
      "epoch 1992: loss = 1719996.004075, a = 930.878590, b = 152.530997\n",
      "epoch 1993: loss = 1719994.695647, a = 930.913666, b = 152.530975\n",
      "epoch 1994: loss = 1719993.392289, a = 930.948672, b = 152.530952\n",
      "epoch 1995: loss = 1719992.093981, a = 930.983607, b = 152.530930\n",
      "epoch 1996: loss = 1719990.800704, a = 931.018473, b = 152.530908\n",
      "epoch 1997: loss = 1719989.512438, a = 931.053270, b = 152.530885\n",
      "epoch 1998: loss = 1719988.229162, a = 931.087996, b = 152.530863\n",
      "epoch 1999: loss = 1719986.950857, a = 931.122653, b = 152.530841\n",
      "epoch 2000: loss = 1719985.677504, a = 931.157241, b = 152.530819\n",
      "epoch 2001: loss = 1719984.409083, a = 931.191760, b = 152.530797\n",
      "epoch 2002: loss = 1719983.145576, a = 931.226210, b = 152.530775\n",
      "epoch 2003: loss = 1719981.886961, a = 931.260591, b = 152.530753\n",
      "epoch 2004: loss = 1719980.633221, a = 931.294903, b = 152.530731\n",
      "epoch 2005: loss = 1719979.384336, a = 931.329146, b = 152.530709\n",
      "epoch 2006: loss = 1719978.140286, a = 931.363321, b = 152.530687\n",
      "epoch 2007: loss = 1719976.901054, a = 931.397428, b = 152.530666\n",
      "epoch 2008: loss = 1719975.666620, a = 931.431466, b = 152.530644\n",
      "epoch 2009: loss = 1719974.436965, a = 931.465437, b = 152.530622\n",
      "epoch 2010: loss = 1719973.212070, a = 931.499339, b = 152.530601\n",
      "epoch 2011: loss = 1719971.991917, a = 931.533174, b = 152.530579\n",
      "epoch 2012: loss = 1719970.776487, a = 931.566941, b = 152.530557\n",
      "epoch 2013: loss = 1719969.565762, a = 931.600640, b = 152.530536\n",
      "epoch 2014: loss = 1719968.359722, a = 931.634272, b = 152.530514\n",
      "epoch 2015: loss = 1719967.158350, a = 931.667837, b = 152.530493\n",
      "epoch 2016: loss = 1719965.961627, a = 931.701335, b = 152.530472\n",
      "epoch 2017: loss = 1719964.769535, a = 931.734766, b = 152.530450\n",
      "epoch 2018: loss = 1719963.582056, a = 931.768130, b = 152.530429\n",
      "epoch 2019: loss = 1719962.399172, a = 931.801427, b = 152.530408\n",
      "epoch 2020: loss = 1719961.220864, a = 931.834657, b = 152.530386\n",
      "epoch 2021: loss = 1719960.047114, a = 931.867821, b = 152.530365\n",
      "epoch 2022: loss = 1719958.877905, a = 931.900919, b = 152.530344\n",
      "epoch 2023: loss = 1719957.713219, a = 931.933951, b = 152.530323\n",
      "epoch 2024: loss = 1719956.553038, a = 931.966917, b = 152.530302\n",
      "epoch 2025: loss = 1719955.397344, a = 931.999816, b = 152.530281\n",
      "epoch 2026: loss = 1719954.246120, a = 932.032650, b = 152.530260\n",
      "epoch 2027: loss = 1719953.099348, a = 932.065418, b = 152.530239\n",
      "epoch 2028: loss = 1719951.957011, a = 932.098121, b = 152.530218\n",
      "epoch 2029: loss = 1719950.819091, a = 932.130758, b = 152.530197\n",
      "epoch 2030: loss = 1719949.685570, a = 932.163330, b = 152.530176\n",
      "epoch 2031: loss = 1719948.556433, a = 932.195837, b = 152.530156\n",
      "epoch 2032: loss = 1719947.431660, a = 932.228279, b = 152.530135\n",
      "epoch 2033: loss = 1719946.311236, a = 932.260656, b = 152.530114\n",
      "epoch 2034: loss = 1719945.195143, a = 932.292968, b = 152.530094\n",
      "epoch 2035: loss = 1719944.083364, a = 932.325216, b = 152.530073\n",
      "epoch 2036: loss = 1719942.975882, a = 932.357399, b = 152.530052\n",
      "epoch 2037: loss = 1719941.872681, a = 932.389518, b = 152.530032\n",
      "epoch 2038: loss = 1719940.773742, a = 932.421573, b = 152.530012\n",
      "epoch 2039: loss = 1719939.679051, a = 932.453563, b = 152.529991\n",
      "epoch 2040: loss = 1719938.588590, a = 932.485490, b = 152.529971\n",
      "epoch 2041: loss = 1719937.502342, a = 932.517352, b = 152.529950\n",
      "epoch 2042: loss = 1719936.420291, a = 932.549151, b = 152.529930\n",
      "epoch 2043: loss = 1719935.342420, a = 932.580887, b = 152.529910\n",
      "epoch 2044: loss = 1719934.268714, a = 932.612559, b = 152.529890\n",
      "epoch 2045: loss = 1719933.199154, a = 932.644167, b = 152.529869\n",
      "epoch 2046: loss = 1719932.133727, a = 932.675713, b = 152.529849\n",
      "epoch 2047: loss = 1719931.072414, a = 932.707195, b = 152.529829\n",
      "epoch 2048: loss = 1719930.015201, a = 932.738614, b = 152.529809\n",
      "epoch 2049: loss = 1719928.962070, a = 932.769971, b = 152.529789\n",
      "epoch 2050: loss = 1719927.913006, a = 932.801265, b = 152.529769\n",
      "epoch 2051: loss = 1719926.867993, a = 932.832496, b = 152.529749\n",
      "epoch 2052: loss = 1719925.827015, a = 932.863665, b = 152.529729\n",
      "epoch 2053: loss = 1719924.790056, a = 932.894771, b = 152.529709\n",
      "epoch 2054: loss = 1719923.757100, a = 932.925815, b = 152.529689\n",
      "epoch 2055: loss = 1719922.728132, a = 932.956798, b = 152.529670\n",
      "epoch 2056: loss = 1719921.703136, a = 932.987718, b = 152.529650\n",
      "epoch 2057: loss = 1719920.682097, a = 933.018576, b = 152.529630\n",
      "epoch 2058: loss = 1719919.664998, a = 933.049373, b = 152.529611\n",
      "epoch 2059: loss = 1719918.651824, a = 933.080108, b = 152.529591\n",
      "epoch 2060: loss = 1719917.642561, a = 933.110782, b = 152.529571\n",
      "epoch 2061: loss = 1719916.637192, a = 933.141394, b = 152.529552\n",
      "epoch 2062: loss = 1719915.635703, a = 933.171945, b = 152.529532\n",
      "epoch 2063: loss = 1719914.638078, a = 933.202435, b = 152.529513\n",
      "epoch 2064: loss = 1719913.644301, a = 933.232864, b = 152.529493\n",
      "epoch 2065: loss = 1719912.654359, a = 933.263232, b = 152.529474\n",
      "epoch 2066: loss = 1719911.668235, a = 933.293540, b = 152.529455\n",
      "epoch 2067: loss = 1719910.685915, a = 933.323787, b = 152.529435\n",
      "epoch 2068: loss = 1719909.707384, a = 933.353973, b = 152.529416\n",
      "epoch 2069: loss = 1719908.732628, a = 933.384099, b = 152.529397\n",
      "epoch 2070: loss = 1719907.761630, a = 933.414165, b = 152.529378\n",
      "epoch 2071: loss = 1719906.794377, a = 933.444170, b = 152.529358\n",
      "epoch 2072: loss = 1719905.830853, a = 933.474116, b = 152.529339\n",
      "epoch 2073: loss = 1719904.871045, a = 933.504002, b = 152.529320\n",
      "epoch 2074: loss = 1719903.914938, a = 933.533828, b = 152.529301\n",
      "epoch 2075: loss = 1719902.962516, a = 933.563594, b = 152.529282\n",
      "epoch 2076: loss = 1719902.013766, a = 933.593301, b = 152.529263\n",
      "epoch 2077: loss = 1719901.068673, a = 933.622949, b = 152.529244\n",
      "epoch 2078: loss = 1719900.127223, a = 933.652537, b = 152.529225\n",
      "epoch 2079: loss = 1719899.189402, a = 933.682066, b = 152.529206\n",
      "epoch 2080: loss = 1719898.255195, a = 933.711536, b = 152.529188\n",
      "epoch 2081: loss = 1719897.324588, a = 933.740947, b = 152.529169\n",
      "epoch 2082: loss = 1719896.397567, a = 933.770299, b = 152.529150\n",
      "epoch 2083: loss = 1719895.474119, a = 933.799592, b = 152.529131\n",
      "epoch 2084: loss = 1719894.554228, a = 933.828827, b = 152.529113\n",
      "epoch 2085: loss = 1719893.637881, a = 933.858004, b = 152.529094\n",
      "epoch 2086: loss = 1719892.725064, a = 933.887122, b = 152.529075\n",
      "epoch 2087: loss = 1719891.815764, a = 933.916182, b = 152.529057\n",
      "epoch 2088: loss = 1719890.909966, a = 933.945183, b = 152.529038\n",
      "epoch 2089: loss = 1719890.007657, a = 933.974127, b = 152.529020\n",
      "epoch 2090: loss = 1719889.108823, a = 934.003013, b = 152.529001\n",
      "epoch 2091: loss = 1719888.213450, a = 934.031841, b = 152.528983\n",
      "epoch 2092: loss = 1719887.321526, a = 934.060612, b = 152.528965\n",
      "epoch 2093: loss = 1719886.433035, a = 934.089325, b = 152.528946\n",
      "epoch 2094: loss = 1719885.547966, a = 934.117980, b = 152.528928\n",
      "epoch 2095: loss = 1719884.666304, a = 934.146579, b = 152.528910\n",
      "epoch 2096: loss = 1719883.788036, a = 934.175120, b = 152.528892\n",
      "epoch 2097: loss = 1719882.913149, a = 934.203604, b = 152.528873\n",
      "epoch 2098: loss = 1719882.041630, a = 934.232031, b = 152.528855\n",
      "epoch 2099: loss = 1719881.173465, a = 934.260401, b = 152.528837\n",
      "epoch 2100: loss = 1719880.308641, a = 934.288714, b = 152.528819\n",
      "epoch 2101: loss = 1719879.447146, a = 934.316971, b = 152.528801\n",
      "epoch 2102: loss = 1719878.588965, a = 934.345171, b = 152.528783\n",
      "epoch 2103: loss = 1719877.734087, a = 934.373315, b = 152.528765\n",
      "epoch 2104: loss = 1719876.882498, a = 934.401403, b = 152.528747\n",
      "epoch 2105: loss = 1719876.034185, a = 934.429435, b = 152.528729\n",
      "epoch 2106: loss = 1719875.189135, a = 934.457410, b = 152.528711\n",
      "epoch 2107: loss = 1719874.347336, a = 934.485329, b = 152.528693\n",
      "epoch 2108: loss = 1719873.508776, a = 934.513193, b = 152.528676\n",
      "epoch 2109: loss = 1719872.673440, a = 934.541001, b = 152.528658\n",
      "epoch 2110: loss = 1719871.841317, a = 934.568753, b = 152.528640\n",
      "epoch 2111: loss = 1719871.012394, a = 934.596450, b = 152.528622\n",
      "epoch 2112: loss = 1719870.186658, a = 934.624092, b = 152.528605\n",
      "epoch 2113: loss = 1719869.364098, a = 934.651678, b = 152.528587\n",
      "epoch 2114: loss = 1719868.544700, a = 934.679209, b = 152.528570\n",
      "epoch 2115: loss = 1719867.728452, a = 934.706685, b = 152.528552\n",
      "epoch 2116: loss = 1719866.915342, a = 934.734106, b = 152.528535\n",
      "epoch 2117: loss = 1719866.105358, a = 934.761472, b = 152.528517\n",
      "epoch 2118: loss = 1719865.298486, a = 934.788784, b = 152.528500\n",
      "epoch 2119: loss = 1719864.494716, a = 934.816041, b = 152.528482\n",
      "epoch 2120: loss = 1719863.694035, a = 934.843243, b = 152.528465\n",
      "epoch 2121: loss = 1719862.896431, a = 934.870391, b = 152.528447\n",
      "epoch 2122: loss = 1719862.101892, a = 934.897485, b = 152.528430\n",
      "epoch 2123: loss = 1719861.310405, a = 934.924524, b = 152.528413\n",
      "epoch 2124: loss = 1719860.521959, a = 934.951509, b = 152.528396\n",
      "epoch 2125: loss = 1719859.736543, a = 934.978441, b = 152.528378\n",
      "epoch 2126: loss = 1719858.954143, a = 935.005319, b = 152.528361\n",
      "epoch 2127: loss = 1719858.174749, a = 935.032142, b = 152.528344\n",
      "epoch 2128: loss = 1719857.398348, a = 935.058913, b = 152.528327\n",
      "epoch 2129: loss = 1719856.624929, a = 935.085629, b = 152.528310\n",
      "epoch 2130: loss = 1719855.854480, a = 935.112293, b = 152.528293\n",
      "epoch 2131: loss = 1719855.086989, a = 935.138903, b = 152.528276\n",
      "epoch 2132: loss = 1719854.322446, a = 935.165459, b = 152.528259\n",
      "epoch 2133: loss = 1719853.560837, a = 935.191963, b = 152.528242\n",
      "epoch 2134: loss = 1719852.802153, a = 935.218414, b = 152.528225\n",
      "epoch 2135: loss = 1719852.046381, a = 935.244811, b = 152.528208\n",
      "epoch 2136: loss = 1719851.293510, a = 935.271156, b = 152.528191\n",
      "epoch 2137: loss = 1719850.543529, a = 935.297449, b = 152.528175\n",
      "epoch 2138: loss = 1719849.796427, a = 935.323688, b = 152.528158\n",
      "epoch 2139: loss = 1719849.052191, a = 935.349876, b = 152.528141\n",
      "epoch 2140: loss = 1719848.310811, a = 935.376010, b = 152.528125\n",
      "epoch 2141: loss = 1719847.572276, a = 935.402093, b = 152.528108\n",
      "epoch 2142: loss = 1719846.836575, a = 935.428123, b = 152.528091\n",
      "epoch 2143: loss = 1719846.103696, a = 935.454102, b = 152.528075\n",
      "epoch 2144: loss = 1719845.373629, a = 935.480028, b = 152.528058\n",
      "epoch 2145: loss = 1719844.646362, a = 935.505903, b = 152.528042\n",
      "epoch 2146: loss = 1719843.921885, a = 935.531726, b = 152.528025\n",
      "epoch 2147: loss = 1719843.200186, a = 935.557497, b = 152.528009\n",
      "epoch 2148: loss = 1719842.481255, a = 935.583217, b = 152.527992\n",
      "epoch 2149: loss = 1719841.765080, a = 935.608885, b = 152.527976\n",
      "epoch 2150: loss = 1719841.051652, a = 935.634502, b = 152.527959\n",
      "epoch 2151: loss = 1719840.340960, a = 935.660068, b = 152.527943\n",
      "epoch 2152: loss = 1719839.632992, a = 935.685582, b = 152.527927\n",
      "epoch 2153: loss = 1719838.927738, a = 935.711046, b = 152.527911\n",
      "epoch 2154: loss = 1719838.225187, a = 935.736458, b = 152.527894\n",
      "epoch 2155: loss = 1719837.525329, a = 935.761820, b = 152.527878\n",
      "epoch 2156: loss = 1719836.828154, a = 935.787131, b = 152.527862\n",
      "epoch 2157: loss = 1719836.133650, a = 935.812392, b = 152.527846\n",
      "epoch 2158: loss = 1719835.441808, a = 935.837602, b = 152.527830\n",
      "epoch 2159: loss = 1719834.752617, a = 935.862761, b = 152.527814\n",
      "epoch 2160: loss = 1719834.066066, a = 935.887871, b = 152.527798\n",
      "epoch 2161: loss = 1719833.382146, a = 935.912930, b = 152.527782\n",
      "epoch 2162: loss = 1719832.700845, a = 935.937939, b = 152.527766\n",
      "epoch 2163: loss = 1719832.022154, a = 935.962898, b = 152.527750\n",
      "epoch 2164: loss = 1719831.346063, a = 935.987807, b = 152.527734\n",
      "epoch 2165: loss = 1719830.672562, a = 936.012666, b = 152.527718\n",
      "epoch 2166: loss = 1719830.001639, a = 936.037475, b = 152.527702\n",
      "epoch 2167: loss = 1719829.333286, a = 936.062235, b = 152.527686\n",
      "epoch 2168: loss = 1719828.667491, a = 936.086946, b = 152.527670\n",
      "epoch 2169: loss = 1719828.004246, a = 936.111607, b = 152.527655\n",
      "epoch 2170: loss = 1719827.343541, a = 936.136218, b = 152.527639\n",
      "epoch 2171: loss = 1719826.685364, a = 936.160781, b = 152.527623\n",
      "epoch 2172: loss = 1719826.029707, a = 936.185294, b = 152.527608\n",
      "epoch 2173: loss = 1719825.376559, a = 936.209758, b = 152.527592\n",
      "epoch 2174: loss = 1719824.725911, a = 936.234174, b = 152.527576\n",
      "epoch 2175: loss = 1719824.077753, a = 936.258540, b = 152.527561\n",
      "epoch 2176: loss = 1719823.432075, a = 936.282858, b = 152.527545\n",
      "epoch 2177: loss = 1719822.788867, a = 936.307127, b = 152.527530\n",
      "epoch 2178: loss = 1719822.148121, a = 936.331348, b = 152.527514\n",
      "epoch 2179: loss = 1719821.509826, a = 936.355520, b = 152.527499\n",
      "epoch 2180: loss = 1719820.873972, a = 936.379644, b = 152.527484\n",
      "epoch 2181: loss = 1719820.240551, a = 936.403720, b = 152.527468\n",
      "epoch 2182: loss = 1719819.609552, a = 936.427747, b = 152.527453\n",
      "epoch 2183: loss = 1719818.980966, a = 936.451727, b = 152.527437\n",
      "epoch 2184: loss = 1719818.354784, a = 936.475658, b = 152.527422\n",
      "epoch 2185: loss = 1719817.730997, a = 936.499542, b = 152.527407\n",
      "epoch 2186: loss = 1719817.109594, a = 936.523378, b = 152.527392\n",
      "epoch 2187: loss = 1719816.490568, a = 936.547166, b = 152.527377\n",
      "epoch 2188: loss = 1719815.873907, a = 936.570907, b = 152.527361\n",
      "epoch 2189: loss = 1719815.259604, a = 936.594600, b = 152.527346\n",
      "epoch 2190: loss = 1719814.647649, a = 936.618246, b = 152.527331\n",
      "epoch 2191: loss = 1719814.038033, a = 936.641844, b = 152.527316\n",
      "epoch 2192: loss = 1719813.430746, a = 936.665396, b = 152.527301\n",
      "epoch 2193: loss = 1719812.825780, a = 936.688900, b = 152.527286\n",
      "epoch 2194: loss = 1719812.223125, a = 936.712357, b = 152.527271\n",
      "epoch 2195: loss = 1719811.622773, a = 936.735768, b = 152.527256\n",
      "epoch 2196: loss = 1719811.024714, a = 936.759131, b = 152.527241\n",
      "epoch 2197: loss = 1719810.428940, a = 936.782448, b = 152.527226\n",
      "epoch 2198: loss = 1719809.835442, a = 936.805718, b = 152.527211\n",
      "epoch 2199: loss = 1719809.244210, a = 936.828942, b = 152.527197\n",
      "epoch 2200: loss = 1719808.655236, a = 936.852119, b = 152.527182\n",
      "epoch 2201: loss = 1719808.068512, a = 936.875250, b = 152.527167\n",
      "epoch 2202: loss = 1719807.484027, a = 936.898335, b = 152.527152\n",
      "epoch 2203: loss = 1719806.901775, a = 936.921373, b = 152.527138\n",
      "epoch 2204: loss = 1719806.321745, a = 936.944365, b = 152.527123\n",
      "epoch 2205: loss = 1719805.743929, a = 936.967312, b = 152.527108\n",
      "epoch 2206: loss = 1719805.168319, a = 936.990212, b = 152.527094\n",
      "epoch 2207: loss = 1719804.594905, a = 937.013067, b = 152.527079\n",
      "epoch 2208: loss = 1719804.023681, a = 937.035876, b = 152.527064\n",
      "epoch 2209: loss = 1719803.454636, a = 937.058640, b = 152.527050\n",
      "epoch 2210: loss = 1719802.887762, a = 937.081357, b = 152.527035\n",
      "epoch 2211: loss = 1719802.323051, a = 937.104030, b = 152.527021\n",
      "epoch 2212: loss = 1719801.760495, a = 937.126657, b = 152.527006\n",
      "epoch 2213: loss = 1719801.200084, a = 937.149239, b = 152.526992\n",
      "epoch 2214: loss = 1719800.641811, a = 937.171776, b = 152.526978\n",
      "epoch 2215: loss = 1719800.085668, a = 937.194267, b = 152.526963\n",
      "epoch 2216: loss = 1719799.531645, a = 937.216714, b = 152.526949\n",
      "epoch 2217: loss = 1719798.979736, a = 937.239116, b = 152.526935\n",
      "epoch 2218: loss = 1719798.429930, a = 937.261473, b = 152.526920\n",
      "epoch 2219: loss = 1719797.882221, a = 937.283785, b = 152.526906\n",
      "epoch 2220: loss = 1719797.336601, a = 937.306053, b = 152.526892\n",
      "epoch 2221: loss = 1719796.793060, a = 937.328276, b = 152.526878\n",
      "epoch 2222: loss = 1719796.251591, a = 937.350455, b = 152.526863\n",
      "epoch 2223: loss = 1719795.712185, a = 937.372589, b = 152.526849\n",
      "epoch 2224: loss = 1719795.174836, a = 937.394679, b = 152.526835\n",
      "epoch 2225: loss = 1719794.639534, a = 937.416725, b = 152.526821\n",
      "epoch 2226: loss = 1719794.106272, a = 937.438727, b = 152.526807\n",
      "epoch 2227: loss = 1719793.575042, a = 937.460685, b = 152.526793\n",
      "epoch 2228: loss = 1719793.045835, a = 937.482599, b = 152.526779\n",
      "epoch 2229: loss = 1719792.518645, a = 937.504469, b = 152.526765\n",
      "epoch 2230: loss = 1719791.993463, a = 937.526295, b = 152.526751\n",
      "epoch 2231: loss = 1719791.470281, a = 937.548078, b = 152.526737\n",
      "epoch 2232: loss = 1719790.949091, a = 937.569817, b = 152.526723\n",
      "epoch 2233: loss = 1719790.429886, a = 937.591513, b = 152.526709\n",
      "epoch 2234: loss = 1719789.912658, a = 937.613165, b = 152.526696\n",
      "epoch 2235: loss = 1719789.397400, a = 937.634774, b = 152.526682\n",
      "epoch 2236: loss = 1719788.884103, a = 937.656340, b = 152.526668\n",
      "epoch 2237: loss = 1719788.372760, a = 937.677863, b = 152.526654\n",
      "epoch 2238: loss = 1719787.863363, a = 937.699343, b = 152.526641\n",
      "epoch 2239: loss = 1719787.355906, a = 937.720779, b = 152.526627\n",
      "epoch 2240: loss = 1719786.850379, a = 937.742173, b = 152.526613\n",
      "epoch 2241: loss = 1719786.346776, a = 937.763524, b = 152.526600\n",
      "epoch 2242: loss = 1719785.845089, a = 937.784833, b = 152.526586\n",
      "epoch 2243: loss = 1719785.345311, a = 937.806098, b = 152.526572\n",
      "epoch 2244: loss = 1719784.847435, a = 937.827322, b = 152.526559\n",
      "epoch 2245: loss = 1719784.351452, a = 937.848502, b = 152.526545\n",
      "epoch 2246: loss = 1719783.857356, a = 937.869641, b = 152.526532\n",
      "epoch 2247: loss = 1719783.365139, a = 937.890737, b = 152.526518\n",
      "epoch 2248: loss = 1719782.874794, a = 937.911791, b = 152.526505\n",
      "epoch 2249: loss = 1719782.386313, a = 937.932803, b = 152.526492\n",
      "epoch 2250: loss = 1719781.899690, a = 937.953773, b = 152.526478\n",
      "epoch 2251: loss = 1719781.414916, a = 937.974701, b = 152.526465\n",
      "epoch 2252: loss = 1719780.931986, a = 937.995587, b = 152.526451\n",
      "epoch 2253: loss = 1719780.450892, a = 938.016431, b = 152.526438\n",
      "epoch 2254: loss = 1719779.971625, a = 938.037234, b = 152.526425\n",
      "epoch 2255: loss = 1719779.494181, a = 938.057995, b = 152.526412\n",
      "epoch 2256: loss = 1719779.018550, a = 938.078714, b = 152.526398\n",
      "epoch 2257: loss = 1719778.544727, a = 938.099392, b = 152.526385\n",
      "epoch 2258: loss = 1719778.072705, a = 938.120029, b = 152.526372\n",
      "epoch 2259: loss = 1719777.602475, a = 938.140625, b = 152.526359\n",
      "epoch 2260: loss = 1719777.134032, a = 938.161179, b = 152.526346\n",
      "epoch 2261: loss = 1719776.667368, a = 938.181692, b = 152.526333\n",
      "epoch 2262: loss = 1719776.202476, a = 938.202164, b = 152.526319\n",
      "epoch 2263: loss = 1719775.739350, a = 938.222595, b = 152.526306\n",
      "epoch 2264: loss = 1719775.277983, a = 938.242986, b = 152.526293\n",
      "epoch 2265: loss = 1719774.818367, a = 938.263335, b = 152.526280\n",
      "epoch 2266: loss = 1719774.360496, a = 938.283644, b = 152.526267\n",
      "epoch 2267: loss = 1719773.904364, a = 938.303913, b = 152.526254\n",
      "epoch 2268: loss = 1719773.449962, a = 938.324140, b = 152.526242\n",
      "epoch 2269: loss = 1719772.997286, a = 938.344328, b = 152.526229\n",
      "epoch 2270: loss = 1719772.546327, a = 938.364475, b = 152.526216\n",
      "epoch 2271: loss = 1719772.097080, a = 938.384581, b = 152.526203\n",
      "epoch 2272: loss = 1719771.649537, a = 938.404648, b = 152.526190\n",
      "epoch 2273: loss = 1719771.203693, a = 938.424674, b = 152.526177\n",
      "epoch 2274: loss = 1719770.759540, a = 938.444660, b = 152.526165\n",
      "epoch 2275: loss = 1719770.317071, a = 938.464607, b = 152.526152\n",
      "epoch 2276: loss = 1719769.876281, a = 938.484513, b = 152.526139\n",
      "epoch 2277: loss = 1719769.437162, a = 938.504380, b = 152.526126\n",
      "epoch 2278: loss = 1719768.999709, a = 938.524207, b = 152.526114\n",
      "epoch 2279: loss = 1719768.563915, a = 938.543994, b = 152.526101\n",
      "epoch 2280: loss = 1719768.129773, a = 938.563742, b = 152.526089\n",
      "epoch 2281: loss = 1719767.697276, a = 938.583450, b = 152.526076\n",
      "epoch 2282: loss = 1719767.266420, a = 938.603119, b = 152.526063\n",
      "epoch 2283: loss = 1719766.837196, a = 938.622748, b = 152.526051\n",
      "epoch 2284: loss = 1719766.409599, a = 938.642338, b = 152.526038\n",
      "epoch 2285: loss = 1719765.983623, a = 938.661889, b = 152.526026\n",
      "epoch 2286: loss = 1719765.559260, a = 938.681401, b = 152.526013\n",
      "epoch 2287: loss = 1719765.136506, a = 938.700874, b = 152.526001\n",
      "epoch 2288: loss = 1719764.715353, a = 938.720308, b = 152.525989\n",
      "epoch 2289: loss = 1719764.295796, a = 938.739703, b = 152.525976\n",
      "epoch 2290: loss = 1719763.877827, a = 938.759060, b = 152.525964\n",
      "epoch 2291: loss = 1719763.461442, a = 938.778377, b = 152.525951\n",
      "epoch 2292: loss = 1719763.046634, a = 938.797656, b = 152.525939\n",
      "epoch 2293: loss = 1719762.633396, a = 938.816897, b = 152.525927\n",
      "epoch 2294: loss = 1719762.221723, a = 938.836099, b = 152.525915\n",
      "epoch 2295: loss = 1719761.811609, a = 938.855262, b = 152.525902\n",
      "epoch 2296: loss = 1719761.403047, a = 938.874387, b = 152.525890\n",
      "epoch 2297: loss = 1719760.996032, a = 938.893474, b = 152.525878\n",
      "epoch 2298: loss = 1719760.590557, a = 938.912523, b = 152.525866\n",
      "epoch 2299: loss = 1719760.186616, a = 938.931534, b = 152.525854\n",
      "epoch 2300: loss = 1719759.784204, a = 938.950507, b = 152.525842\n",
      "epoch 2301: loss = 1719759.383315, a = 938.969442, b = 152.525829\n",
      "epoch 2302: loss = 1719758.983942, a = 938.988339, b = 152.525817\n",
      "epoch 2303: loss = 1719758.586080, a = 939.007198, b = 152.525805\n",
      "epoch 2304: loss = 1719758.189723, a = 939.026019, b = 152.525793\n",
      "epoch 2305: loss = 1719757.794866, a = 939.044803, b = 152.525781\n",
      "epoch 2306: loss = 1719757.401501, a = 939.063549, b = 152.525769\n",
      "epoch 2307: loss = 1719757.009624, a = 939.082258, b = 152.525757\n",
      "epoch 2308: loss = 1719756.619228, a = 939.100929, b = 152.525745\n",
      "epoch 2309: loss = 1719756.230309, a = 939.119563, b = 152.525734\n",
      "epoch 2310: loss = 1719755.842860, a = 939.138160, b = 152.525722\n",
      "epoch 2311: loss = 1719755.456875, a = 939.156719, b = 152.525710\n",
      "epoch 2312: loss = 1719755.072349, a = 939.175242, b = 152.525698\n",
      "epoch 2313: loss = 1719754.689276, a = 939.193727, b = 152.525686\n",
      "epoch 2314: loss = 1719754.307651, a = 939.212176, b = 152.525674\n",
      "epoch 2315: loss = 1719753.927467, a = 939.230587, b = 152.525663\n",
      "epoch 2316: loss = 1719753.548720, a = 939.248962, b = 152.525651\n",
      "epoch 2317: loss = 1719753.171404, a = 939.267300, b = 152.525639\n",
      "epoch 2318: loss = 1719752.795512, a = 939.285601, b = 152.525627\n",
      "epoch 2319: loss = 1719752.421041, a = 939.303866, b = 152.525616\n",
      "epoch 2320: loss = 1719752.047983, a = 939.322094, b = 152.525604\n",
      "epoch 2321: loss = 1719751.676335, a = 939.340286, b = 152.525593\n",
      "epoch 2322: loss = 1719751.306089, a = 939.358441, b = 152.525581\n",
      "epoch 2323: loss = 1719750.937241, a = 939.376560, b = 152.525569\n",
      "epoch 2324: loss = 1719750.569786, a = 939.394643, b = 152.525558\n",
      "epoch 2325: loss = 1719750.203717, a = 939.412690, b = 152.525546\n",
      "epoch 2326: loss = 1719749.839030, a = 939.430701, b = 152.525535\n",
      "epoch 2327: loss = 1719749.475719, a = 939.448675, b = 152.525523\n",
      "epoch 2328: loss = 1719749.113779, a = 939.466614, b = 152.525512\n",
      "epoch 2329: loss = 1719748.753205, a = 939.484516, b = 152.525500\n",
      "epoch 2330: loss = 1719748.393990, a = 939.502383, b = 152.525489\n",
      "epoch 2331: loss = 1719748.036131, a = 939.520215, b = 152.525478\n",
      "epoch 2332: loss = 1719747.679621, a = 939.538010, b = 152.525466\n",
      "epoch 2333: loss = 1719747.324456, a = 939.555770, b = 152.525455\n",
      "epoch 2334: loss = 1719746.970631, a = 939.573495, b = 152.525444\n",
      "epoch 2335: loss = 1719746.618139, a = 939.591184, b = 152.525432\n",
      "epoch 2336: loss = 1719746.266976, a = 939.608837, b = 152.525421\n",
      "epoch 2337: loss = 1719745.917137, a = 939.626456, b = 152.525410\n",
      "epoch 2338: loss = 1719745.568616, a = 939.644039, b = 152.525399\n",
      "epoch 2339: loss = 1719745.221409, a = 939.661587, b = 152.525387\n",
      "epoch 2340: loss = 1719744.875511, a = 939.679100, b = 152.525376\n",
      "epoch 2341: loss = 1719744.530916, a = 939.696577, b = 152.525365\n",
      "epoch 2342: loss = 1719744.187619, a = 939.714020, b = 152.525354\n",
      "epoch 2343: loss = 1719743.845615, a = 939.731428, b = 152.525343\n",
      "epoch 2344: loss = 1719743.504900, a = 939.748802, b = 152.525332\n",
      "epoch 2345: loss = 1719743.165468, a = 939.766140, b = 152.525321\n",
      "epoch 2346: loss = 1719742.827314, a = 939.783444, b = 152.525310\n",
      "epoch 2347: loss = 1719742.490434, a = 939.800713, b = 152.525298\n",
      "epoch 2348: loss = 1719742.154822, a = 939.817948, b = 152.525287\n",
      "epoch 2349: loss = 1719741.820473, a = 939.835148, b = 152.525276\n",
      "epoch 2350: loss = 1719741.487384, a = 939.852314, b = 152.525266\n",
      "epoch 2351: loss = 1719741.155548, a = 939.869445, b = 152.525255\n",
      "epoch 2352: loss = 1719740.824960, a = 939.886542, b = 152.525244\n",
      "epoch 2353: loss = 1719740.495617, a = 939.903605, b = 152.525233\n",
      "epoch 2354: loss = 1719740.167513, a = 939.920634, b = 152.525222\n",
      "epoch 2355: loss = 1719739.840644, a = 939.937629, b = 152.525211\n",
      "epoch 2356: loss = 1719739.515004, a = 939.954590, b = 152.525200\n",
      "epoch 2357: loss = 1719739.190589, a = 939.971517, b = 152.525189\n",
      "epoch 2358: loss = 1719738.867394, a = 939.988410, b = 152.525179\n",
      "epoch 2359: loss = 1719738.545415, a = 940.005270, b = 152.525168\n",
      "epoch 2360: loss = 1719738.224646, a = 940.022095, b = 152.525157\n",
      "epoch 2361: loss = 1719737.905083, a = 940.038887, b = 152.525146\n",
      "epoch 2362: loss = 1719737.586722, a = 940.055646, b = 152.525136\n",
      "epoch 2363: loss = 1719737.269558, a = 940.072370, b = 152.525125\n",
      "epoch 2364: loss = 1719736.953585, a = 940.089062, b = 152.525114\n",
      "epoch 2365: loss = 1719736.638800, a = 940.105720, b = 152.525104\n",
      "epoch 2366: loss = 1719736.325198, a = 940.122345, b = 152.525093\n",
      "epoch 2367: loss = 1719736.012774, a = 940.138936, b = 152.525082\n",
      "epoch 2368: loss = 1719735.701524, a = 940.155495, b = 152.525072\n",
      "epoch 2369: loss = 1719735.391444, a = 940.172020, b = 152.525061\n",
      "epoch 2370: loss = 1719735.082527, a = 940.188512, b = 152.525051\n",
      "epoch 2371: loss = 1719734.774771, a = 940.204971, b = 152.525040\n",
      "epoch 2372: loss = 1719734.468171, a = 940.221397, b = 152.525030\n",
      "epoch 2373: loss = 1719734.162722, a = 940.237791, b = 152.525019\n",
      "epoch 2374: loss = 1719733.858420, a = 940.254151, b = 152.525009\n",
      "epoch 2375: loss = 1719733.555260, a = 940.270479, b = 152.524998\n",
      "epoch 2376: loss = 1719733.253238, a = 940.286775, b = 152.524988\n",
      "epoch 2377: loss = 1719732.952350, a = 940.303037, b = 152.524978\n",
      "epoch 2378: loss = 1719732.652590, a = 940.319268, b = 152.524967\n",
      "epoch 2379: loss = 1719732.353956, a = 940.335465, b = 152.524957\n",
      "epoch 2380: loss = 1719732.056441, a = 940.351631, b = 152.524947\n",
      "epoch 2381: loss = 1719731.760043, a = 940.367764, b = 152.524936\n",
      "epoch 2382: loss = 1719731.464757, a = 940.383864, b = 152.524926\n",
      "epoch 2383: loss = 1719731.170578, a = 940.399933, b = 152.524916\n",
      "epoch 2384: loss = 1719730.877503, a = 940.415969, b = 152.524906\n",
      "epoch 2385: loss = 1719730.585526, a = 940.431974, b = 152.524895\n",
      "epoch 2386: loss = 1719730.294644, a = 940.447946, b = 152.524885\n",
      "epoch 2387: loss = 1719730.004853, a = 940.463887, b = 152.524875\n",
      "epoch 2388: loss = 1719729.716147, a = 940.479795, b = 152.524865\n",
      "epoch 2389: loss = 1719729.428524, a = 940.495672, b = 152.524855\n",
      "epoch 2390: loss = 1719729.141979, a = 940.511517, b = 152.524844\n",
      "epoch 2391: loss = 1719728.856507, a = 940.527330, b = 152.524834\n",
      "epoch 2392: loss = 1719728.572105, a = 940.543112, b = 152.524824\n",
      "epoch 2393: loss = 1719728.288769, a = 940.558862, b = 152.524814\n",
      "epoch 2394: loss = 1719728.006493, a = 940.574580, b = 152.524804\n",
      "epoch 2395: loss = 1719727.725275, a = 940.590268, b = 152.524794\n",
      "epoch 2396: loss = 1719727.445110, a = 940.605923, b = 152.524784\n",
      "epoch 2397: loss = 1719727.165994, a = 940.621548, b = 152.524774\n",
      "epoch 2398: loss = 1719726.887924, a = 940.637141, b = 152.524764\n",
      "epoch 2399: loss = 1719726.610894, a = 940.652703, b = 152.524754\n",
      "epoch 2400: loss = 1719726.334901, a = 940.668234, b = 152.524744\n",
      "epoch 2401: loss = 1719726.059941, a = 940.683734, b = 152.524734\n",
      "epoch 2402: loss = 1719725.786010, a = 940.699203, b = 152.524725\n",
      "epoch 2403: loss = 1719725.513104, a = 940.714641, b = 152.524715\n",
      "epoch 2404: loss = 1719725.241219, a = 940.730048, b = 152.524705\n",
      "epoch 2405: loss = 1719724.970351, a = 940.745424, b = 152.524695\n",
      "epoch 2406: loss = 1719724.700496, a = 940.760770, b = 152.524685\n",
      "epoch 2407: loss = 1719724.431651, a = 940.776085, b = 152.524676\n",
      "epoch 2408: loss = 1719724.163811, a = 940.791369, b = 152.524666\n",
      "epoch 2409: loss = 1719723.896972, a = 940.806623, b = 152.524656\n",
      "epoch 2410: loss = 1719723.631131, a = 940.821846, b = 152.524646\n",
      "epoch 2411: loss = 1719723.366284, a = 940.837039, b = 152.524637\n",
      "epoch 2412: loss = 1719723.102427, a = 940.852201, b = 152.524627\n",
      "epoch 2413: loss = 1719722.839556, a = 940.867333, b = 152.524617\n",
      "epoch 2414: loss = 1719722.577667, a = 940.882435, b = 152.524608\n",
      "epoch 2415: loss = 1719722.316757, a = 940.897506, b = 152.524598\n",
      "epoch 2416: loss = 1719722.056821, a = 940.912548, b = 152.524588\n",
      "epoch 2417: loss = 1719721.797857, a = 940.927559, b = 152.524579\n",
      "epoch 2418: loss = 1719721.539859, a = 940.942541, b = 152.524569\n",
      "epoch 2419: loss = 1719721.282826, a = 940.957492, b = 152.524560\n",
      "epoch 2420: loss = 1719721.026752, a = 940.972414, b = 152.524550\n",
      "epoch 2421: loss = 1719720.771634, a = 940.987305, b = 152.524541\n",
      "epoch 2422: loss = 1719720.517469, a = 941.002167, b = 152.524531\n",
      "epoch 2423: loss = 1719720.264252, a = 941.016999, b = 152.524522\n",
      "epoch 2424: loss = 1719720.011980, a = 941.031802, b = 152.524512\n",
      "epoch 2425: loss = 1719719.760650, a = 941.046575, b = 152.524503\n",
      "epoch 2426: loss = 1719719.510258, a = 941.061318, b = 152.524493\n",
      "epoch 2427: loss = 1719719.260800, a = 941.076032, b = 152.524484\n",
      "epoch 2428: loss = 1719719.012273, a = 941.090716, b = 152.524475\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch 2429: loss = 1719718.764672, a = 941.105371, b = 152.524465\n",
      "epoch 2430: loss = 1719718.517995, a = 941.119997, b = 152.524456\n",
      "epoch 2431: loss = 1719718.272238, a = 941.134594, b = 152.524447\n",
      "epoch 2432: loss = 1719718.027398, a = 941.149161, b = 152.524437\n",
      "epoch 2433: loss = 1719717.783470, a = 941.163699, b = 152.524428\n",
      "epoch 2434: loss = 1719717.540451, a = 941.178208, b = 152.524419\n",
      "epoch 2435: loss = 1719717.298338, a = 941.192688, b = 152.524409\n",
      "epoch 2436: loss = 1719717.057128, a = 941.207140, b = 152.524400\n",
      "epoch 2437: loss = 1719716.816816, a = 941.221562, b = 152.524391\n",
      "epoch 2438: loss = 1719716.577400, a = 941.235955, b = 152.524382\n",
      "epoch 2439: loss = 1719716.338876, a = 941.250320, b = 152.524373\n",
      "epoch 2440: loss = 1719716.101240, a = 941.264656, b = 152.524363\n",
      "epoch 2441: loss = 1719715.864489, a = 941.278963, b = 152.524354\n",
      "epoch 2442: loss = 1719715.628620, a = 941.293242, b = 152.524345\n",
      "epoch 2443: loss = 1719715.393629, a = 941.307492, b = 152.524336\n",
      "epoch 2444: loss = 1719715.159513, a = 941.321714, b = 152.524327\n",
      "epoch 2445: loss = 1719714.926269, a = 941.335907, b = 152.524318\n",
      "epoch 2446: loss = 1719714.693893, a = 941.350072, b = 152.524309\n",
      "epoch 2447: loss = 1719714.462381, a = 941.364208, b = 152.524300\n",
      "epoch 2448: loss = 1719714.231731, a = 941.378316, b = 152.524291\n",
      "epoch 2449: loss = 1719714.001940, a = 941.392396, b = 152.524282\n",
      "epoch 2450: loss = 1719713.773003, a = 941.406448, b = 152.524273\n",
      "epoch 2451: loss = 1719713.544917, a = 941.420472, b = 152.524264\n",
      "epoch 2452: loss = 1719713.317680, a = 941.434467, b = 152.524255\n",
      "epoch 2453: loss = 1719713.091289, a = 941.448435, b = 152.524246\n",
      "epoch 2454: loss = 1719712.865738, a = 941.462375, b = 152.524237\n",
      "epoch 2455: loss = 1719712.641027, a = 941.476287, b = 152.524228\n",
      "epoch 2456: loss = 1719712.417151, a = 941.490171, b = 152.524219\n",
      "epoch 2457: loss = 1719712.194107, a = 941.504027, b = 152.524211\n",
      "epoch 2458: loss = 1719711.971892, a = 941.517856, b = 152.524202\n",
      "epoch 2459: loss = 1719711.750502, a = 941.531657, b = 152.524193\n",
      "epoch 2460: loss = 1719711.529935, a = 941.545430, b = 152.524184\n",
      "epoch 2461: loss = 1719711.310188, a = 941.559176, b = 152.524175\n",
      "epoch 2462: loss = 1719711.091257, a = 941.572894, b = 152.524167\n",
      "epoch 2463: loss = 1719710.873139, a = 941.586585, b = 152.524158\n",
      "epoch 2464: loss = 1719710.655831, a = 941.600249, b = 152.524149\n",
      "epoch 2465: loss = 1719710.439329, a = 941.613885, b = 152.524140\n",
      "epoch 2466: loss = 1719710.223632, a = 941.627494, b = 152.524132\n",
      "epoch 2467: loss = 1719710.008735, a = 941.641075, b = 152.524123\n",
      "epoch 2468: loss = 1719709.794636, a = 941.654630, b = 152.524114\n",
      "epoch 2469: loss = 1719709.581332, a = 941.668157, b = 152.524106\n",
      "epoch 2470: loss = 1719709.368819, a = 941.681658, b = 152.524097\n",
      "epoch 2471: loss = 1719709.157094, a = 941.695131, b = 152.524089\n",
      "epoch 2472: loss = 1719708.946155, a = 941.708578, b = 152.524080\n",
      "epoch 2473: loss = 1719708.735998, a = 941.721997, b = 152.524071\n",
      "epoch 2474: loss = 1719708.526620, a = 941.735390, b = 152.524063\n",
      "epoch 2475: loss = 1719708.318019, a = 941.748756, b = 152.524054\n",
      "epoch 2476: loss = 1719708.110192, a = 941.762095, b = 152.524046\n",
      "epoch 2477: loss = 1719707.903135, a = 941.775408, b = 152.524037\n",
      "epoch 2478: loss = 1719707.696845, a = 941.788694, b = 152.524029\n",
      "epoch 2479: loss = 1719707.491320, a = 941.801953, b = 152.524020\n",
      "epoch 2480: loss = 1719707.286557, a = 941.815186, b = 152.524012\n",
      "epoch 2481: loss = 1719707.082552, a = 941.828392, b = 152.524003\n",
      "epoch 2482: loss = 1719706.879303, a = 941.841572, b = 152.523995\n",
      "epoch 2483: loss = 1719706.676807, a = 941.854726, b = 152.523987\n",
      "epoch 2484: loss = 1719706.475060, a = 941.867853, b = 152.523978\n",
      "epoch 2485: loss = 1719706.274061, a = 941.880954, b = 152.523970\n",
      "epoch 2486: loss = 1719706.073807, a = 941.894029, b = 152.523961\n",
      "epoch 2487: loss = 1719705.874293, a = 941.907078, b = 152.523953\n",
      "epoch 2488: loss = 1719705.675518, a = 941.920100, b = 152.523945\n",
      "epoch 2489: loss = 1719705.477479, a = 941.933097, b = 152.523937\n",
      "epoch 2490: loss = 1719705.280173, a = 941.946068, b = 152.523928\n",
      "epoch 2491: loss = 1719705.083597, a = 941.959012, b = 152.523920\n",
      "epoch 2492: loss = 1719704.887748, a = 941.971931, b = 152.523912\n",
      "epoch 2493: loss = 1719704.692623, a = 941.984824, b = 152.523903\n",
      "epoch 2494: loss = 1719704.498220, a = 941.997691, b = 152.523895\n",
      "epoch 2495: loss = 1719704.304537, a = 942.010533, b = 152.523887\n",
      "epoch 2496: loss = 1719704.111569, a = 942.023348, b = 152.523879\n",
      "epoch 2497: loss = 1719703.919315, a = 942.036138, b = 152.523871\n",
      "epoch 2498: loss = 1719703.727771, a = 942.048903, b = 152.523863\n",
      "epoch 2499: loss = 1719703.536936, a = 942.061642, b = 152.523854\n",
      "epoch 2500: loss = 1719703.346805, a = 942.074356, b = 152.523846\n",
      "epoch 2501: loss = 1719703.157378, a = 942.087044, b = 152.523838\n",
      "epoch 2502: loss = 1719702.968650, a = 942.099706, b = 152.523830\n",
      "epoch 2503: loss = 1719702.780619, a = 942.112344, b = 152.523822\n",
      "epoch 2504: loss = 1719702.593283, a = 942.124956, b = 152.523814\n",
      "epoch 2505: loss = 1719702.406639, a = 942.137543, b = 152.523806\n",
      "epoch 2506: loss = 1719702.220684, a = 942.150105, b = 152.523798\n",
      "epoch 2507: loss = 1719702.035415, a = 942.162641, b = 152.523790\n",
      "epoch 2508: loss = 1719701.850830, a = 942.175153, b = 152.523782\n",
      "epoch 2509: loss = 1719701.666927, a = 942.187640, b = 152.523774\n",
      "epoch 2510: loss = 1719701.483702, a = 942.200101, b = 152.523766\n",
      "epoch 2511: loss = 1719701.301154, a = 942.212538, b = 152.523758\n",
      "epoch 2512: loss = 1719701.119279, a = 942.224950, b = 152.523750\n",
      "epoch 2513: loss = 1719700.938075, a = 942.237337, b = 152.523742\n",
      "epoch 2514: loss = 1719700.757539, a = 942.249699, b = 152.523734\n",
      "epoch 2515: loss = 1719700.577669, a = 942.262036, b = 152.523726\n",
      "epoch 2516: loss = 1719700.398462, a = 942.274349, b = 152.523719\n",
      "epoch 2517: loss = 1719700.219916, a = 942.286637, b = 152.523711\n",
      "epoch 2518: loss = 1719700.042028, a = 942.298901, b = 152.523703\n",
      "epoch 2519: loss = 1719699.864796, a = 942.311140, b = 152.523695\n",
      "epoch 2520: loss = 1719699.688217, a = 942.323355, b = 152.523687\n",
      "epoch 2521: loss = 1719699.512289, a = 942.335545, b = 152.523679\n",
      "epoch 2522: loss = 1719699.337009, a = 942.347711, b = 152.523672\n",
      "epoch 2523: loss = 1719699.162374, a = 942.359852, b = 152.523664\n",
      "epoch 2524: loss = 1719698.988383, a = 942.371970, b = 152.523656\n",
      "epoch 2525: loss = 1719698.815032, a = 942.384063, b = 152.523649\n",
      "epoch 2526: loss = 1719698.642320, a = 942.396132, b = 152.523641\n",
      "epoch 2527: loss = 1719698.470244, a = 942.408176, b = 152.523633\n",
      "epoch 2528: loss = 1719698.298801, a = 942.420197, b = 152.523625\n",
      "epoch 2529: loss = 1719698.127989, a = 942.432193, b = 152.523618\n",
      "epoch 2530: loss = 1719697.957806, a = 942.444166, b = 152.523610\n",
      "epoch 2531: loss = 1719697.788248, a = 942.456115, b = 152.523602\n",
      "epoch 2532: loss = 1719697.619315, a = 942.468039, b = 152.523595\n",
      "epoch 2533: loss = 1719697.451003, a = 942.479940, b = 152.523587\n",
      "epoch 2534: loss = 1719697.283310, a = 942.491817, b = 152.523580\n",
      "epoch 2535: loss = 1719697.116234, a = 942.503671, b = 152.523572\n",
      "epoch 2536: loss = 1719696.949772, a = 942.515500, b = 152.523565\n",
      "epoch 2537: loss = 1719696.783922, a = 942.527306, b = 152.523557\n",
      "epoch 2538: loss = 1719696.618682, a = 942.539089, b = 152.523549\n",
      "epoch 2539: loss = 1719696.454049, a = 942.550847, b = 152.523542\n",
      "epoch 2540: loss = 1719696.290020, a = 942.562583, b = 152.523534\n",
      "epoch 2541: loss = 1719696.126595, a = 942.574295, b = 152.523527\n",
      "epoch 2542: loss = 1719695.963770, a = 942.585983, b = 152.523520\n",
      "epoch 2543: loss = 1719695.801543, a = 942.597648, b = 152.523512\n",
      "epoch 2544: loss = 1719695.639912, a = 942.609290, b = 152.523505\n",
      "epoch 2545: loss = 1719695.478874, a = 942.620908, b = 152.523497\n",
      "epoch 2546: loss = 1719695.318427, a = 942.632503, b = 152.523490\n",
      "epoch 2547: loss = 1719695.158570, a = 942.644075, b = 152.523482\n",
      "epoch 2548: loss = 1719694.999299, a = 942.655624, b = 152.523475\n",
      "epoch 2549: loss = 1719694.840613, a = 942.667150, b = 152.523468\n",
      "epoch 2550: loss = 1719694.682509, a = 942.678653, b = 152.523460\n",
      "epoch 2551: loss = 1719694.524985, a = 942.690133, b = 152.523453\n",
      "epoch 2552: loss = 1719694.368039, a = 942.701589, b = 152.523446\n",
      "epoch 2553: loss = 1719694.211668, a = 942.713023, b = 152.523438\n",
      "epoch 2554: loss = 1719694.055871, a = 942.724434, b = 152.523431\n",
      "epoch 2555: loss = 1719693.900645, a = 942.735822, b = 152.523424\n",
      "epoch 2556: loss = 1719693.745988, a = 942.747188, b = 152.523417\n",
      "epoch 2557: loss = 1719693.591898, a = 942.758531, b = 152.523409\n",
      "epoch 2558: loss = 1719693.438373, a = 942.769851, b = 152.523402\n",
      "epoch 2559: loss = 1719693.285410, a = 942.781148, b = 152.523395\n",
      "epoch 2560: loss = 1719693.133008, a = 942.792423, b = 152.523388\n",
      "epoch 2561: loss = 1719692.981164, a = 942.803675, b = 152.523380\n",
      "epoch 2562: loss = 1719692.829876, a = 942.814905, b = 152.523373\n",
      "epoch 2563: loss = 1719692.679142, a = 942.826112, b = 152.523366\n",
      "epoch 2564: loss = 1719692.528960, a = 942.837297, b = 152.523359\n",
      "epoch 2565: loss = 1719692.379328, a = 942.848459, b = 152.523352\n",
      "epoch 2566: loss = 1719692.230244, a = 942.859600, b = 152.523345\n",
      "epoch 2567: loss = 1719692.081705, a = 942.870717, b = 152.523338\n",
      "epoch 2568: loss = 1719691.933710, a = 942.881813, b = 152.523331\n",
      "epoch 2569: loss = 1719691.786256, a = 942.892887, b = 152.523324\n",
      "epoch 2570: loss = 1719691.639342, a = 942.903938, b = 152.523316\n",
      "epoch 2571: loss = 1719691.492965, a = 942.914967, b = 152.523309\n",
      "epoch 2572: loss = 1719691.347123, a = 942.925974, b = 152.523302\n",
      "epoch 2573: loss = 1719691.201815, a = 942.936960, b = 152.523295\n",
      "epoch 2574: loss = 1719691.057038, a = 942.947923, b = 152.523288\n",
      "epoch 2575: loss = 1719690.912790, a = 942.958864, b = 152.523281\n",
      "epoch 2576: loss = 1719690.769069, a = 942.969783, b = 152.523274\n",
      "epoch 2577: loss = 1719690.625873, a = 942.980681, b = 152.523267\n",
      "epoch 2578: loss = 1719690.483201, a = 942.991557, b = 152.523260\n",
      "epoch 2579: loss = 1719690.341050, a = 943.002411, b = 152.523254\n",
      "epoch 2580: loss = 1719690.199418, a = 943.013243, b = 152.523247\n",
      "epoch 2581: loss = 1719690.058303, a = 943.024054, b = 152.523240\n",
      "epoch 2582: loss = 1719689.917704, a = 943.034843, b = 152.523233\n",
      "epoch 2583: loss = 1719689.777618, a = 943.045610, b = 152.523226\n",
      "epoch 2584: loss = 1719689.638043, a = 943.056356, b = 152.523219\n",
      "epoch 2585: loss = 1719689.498977, a = 943.067081, b = 152.523212\n",
      "epoch 2586: loss = 1719689.360419, a = 943.077784, b = 152.523205\n",
      "epoch 2587: loss = 1719689.222367, a = 943.088465, b = 152.523199\n",
      "epoch 2588: loss = 1719689.084818, a = 943.099126, b = 152.523192\n",
      "epoch 2589: loss = 1719688.947771, a = 943.109765, b = 152.523185\n",
      "epoch 2590: loss = 1719688.811224, a = 943.120382, b = 152.523178\n",
      "epoch 2591: loss = 1719688.675174, a = 943.130979, b = 152.523171\n",
      "epoch 2592: loss = 1719688.539621, a = 943.141554, b = 152.523165\n",
      "epoch 2593: loss = 1719688.404562, a = 943.152108, b = 152.523158\n",
      "epoch 2594: loss = 1719688.269995, a = 943.162641, b = 152.523151\n",
      "epoch 2595: loss = 1719688.135918, a = 943.173153, b = 152.523145\n",
      "epoch 2596: loss = 1719688.002330, a = 943.183644, b = 152.523138\n",
      "epoch 2597: loss = 1719687.869228, a = 943.194114, b = 152.523131\n",
      "epoch 2598: loss = 1719687.736611, a = 943.204563, b = 152.523124\n",
      "epoch 2599: loss = 1719687.604477, a = 943.214991, b = 152.523118\n",
      "epoch 2600: loss = 1719687.472824, a = 943.225398, b = 152.523111\n",
      "epoch 2601: loss = 1719687.341651, a = 943.235784, b = 152.523105\n",
      "epoch 2602: loss = 1719687.210955, a = 943.246150, b = 152.523098\n",
      "epoch 2603: loss = 1719687.080734, a = 943.256495, b = 152.523091\n",
      "epoch 2604: loss = 1719686.950988, a = 943.266819, b = 152.523085\n",
      "epoch 2605: loss = 1719686.821713, a = 943.277123, b = 152.523078\n",
      "epoch 2606: loss = 1719686.692909, a = 943.287406, b = 152.523072\n",
      "epoch 2607: loss = 1719686.564573, a = 943.297668, b = 152.523065\n",
      "epoch 2608: loss = 1719686.436703, a = 943.307910, b = 152.523058\n",
      "epoch 2609: loss = 1719686.309299, a = 943.318132, b = 152.523052\n",
      "epoch 2610: loss = 1719686.182358, a = 943.328333, b = 152.523045\n",
      "epoch 2611: loss = 1719686.055878, a = 943.338513, b = 152.523039\n",
      "epoch 2612: loss = 1719685.929858, a = 943.348673, b = 152.523032\n",
      "epoch 2613: loss = 1719685.804295, a = 943.358813, b = 152.523026\n",
      "epoch 2614: loss = 1719685.679189, a = 943.368933, b = 152.523019\n",
      "epoch 2615: loss = 1719685.554537, a = 943.379032, b = 152.523013\n",
      "epoch 2616: loss = 1719685.430338, a = 943.389112, b = 152.523007\n",
      "epoch 2617: loss = 1719685.306590, a = 943.399171, b = 152.523000\n",
      "epoch 2618: loss = 1719685.183291, a = 943.409210, b = 152.522994\n",
      "epoch 2619: loss = 1719685.060440, a = 943.419228, b = 152.522987\n",
      "epoch 2620: loss = 1719684.938034, a = 943.429227, b = 152.522981\n",
      "epoch 2621: loss = 1719684.816073, a = 943.439206, b = 152.522975\n",
      "epoch 2622: loss = 1719684.694554, a = 943.449165, b = 152.522968\n",
      "epoch 2623: loss = 1719684.573476, a = 943.459104, b = 152.522962\n",
      "epoch 2624: loss = 1719684.452837, a = 943.469023, b = 152.522956\n",
      "epoch 2625: loss = 1719684.332636, a = 943.478922, b = 152.522949\n",
      "epoch 2626: loss = 1719684.212870, a = 943.488802, b = 152.522943\n",
      "epoch 2627: loss = 1719684.093539, a = 943.498662, b = 152.522937\n",
      "epoch 2628: loss = 1719683.974640, a = 943.508502, b = 152.522930\n",
      "epoch 2629: loss = 1719683.856171, a = 943.518322, b = 152.522924\n",
      "epoch 2630: loss = 1719683.738133, a = 943.528123, b = 152.522918\n",
      "epoch 2631: loss = 1719683.620521, a = 943.537904, b = 152.522912\n",
      "epoch 2632: loss = 1719683.503336, a = 943.547665, b = 152.522905\n",
      "epoch 2633: loss = 1719683.386575, a = 943.557407, b = 152.522899\n",
      "epoch 2634: loss = 1719683.270237, a = 943.567130, b = 152.522893\n",
      "epoch 2635: loss = 1719683.154320, a = 943.576833, b = 152.522887\n",
      "epoch 2636: loss = 1719683.038822, a = 943.586516, b = 152.522880\n",
      "epoch 2637: loss = 1719682.923743, a = 943.596181, b = 152.522874\n",
      "epoch 2638: loss = 1719682.809080, a = 943.605826, b = 152.522868\n",
      "epoch 2639: loss = 1719682.694831, a = 943.615451, b = 152.522862\n",
      "epoch 2640: loss = 1719682.580996, a = 943.625058, b = 152.522856\n",
      "epoch 2641: loss = 1719682.467573, a = 943.634645, b = 152.522850\n",
      "epoch 2642: loss = 1719682.354560, a = 943.644213, b = 152.522844\n",
      "epoch 2643: loss = 1719682.241955, a = 943.653762, b = 152.522838\n",
      "epoch 2644: loss = 1719682.129757, a = 943.663292, b = 152.522831\n",
      "epoch 2645: loss = 1719682.017965, a = 943.672803, b = 152.522825\n",
      "epoch 2646: loss = 1719681.906577, a = 943.682294, b = 152.522819\n",
      "epoch 2647: loss = 1719681.795591, a = 943.691767, b = 152.522813\n",
      "epoch 2648: loss = 1719681.685006, a = 943.701221, b = 152.522807\n",
      "epoch 2649: loss = 1719681.574821, a = 943.710656, b = 152.522801\n",
      "epoch 2650: loss = 1719681.465033, a = 943.720072, b = 152.522795\n",
      "epoch 2651: loss = 1719681.355642, a = 943.729469, b = 152.522789\n",
      "epoch 2652: loss = 1719681.246645, a = 943.738848, b = 152.522783\n",
      "epoch 2653: loss = 1719681.138042, a = 943.748208, b = 152.522777\n",
      "epoch 2654: loss = 1719681.029831, a = 943.757548, b = 152.522771\n",
      "epoch 2655: loss = 1719680.922010, a = 943.766871, b = 152.522765\n",
      "epoch 2656: loss = 1719680.814578, a = 943.776174, b = 152.522759\n",
      "epoch 2657: loss = 1719680.707534, a = 943.785460, b = 152.522753\n",
      "epoch 2658: loss = 1719680.600876, a = 943.794726, b = 152.522748\n",
      "epoch 2659: loss = 1719680.494602, a = 943.803974, b = 152.522742\n",
      "epoch 2660: loss = 1719680.388711, a = 943.813203, b = 152.522736\n",
      "epoch 2661: loss = 1719680.283202, a = 943.822414, b = 152.522730\n",
      "epoch 2662: loss = 1719680.178073, a = 943.831607, b = 152.522724\n",
      "epoch 2663: loss = 1719680.073323, a = 943.840781, b = 152.522718\n",
      "epoch 2664: loss = 1719679.968950, a = 943.849937, b = 152.522712\n",
      "epoch 2665: loss = 1719679.864953, a = 943.859075, b = 152.522706\n",
      "epoch 2666: loss = 1719679.761330, a = 943.868194, b = 152.522701\n",
      "epoch 2667: loss = 1719679.658081, a = 943.877295, b = 152.522695\n",
      "epoch 2668: loss = 1719679.555203, a = 943.886378, b = 152.522689\n",
      "epoch 2669: loss = 1719679.452696, a = 943.895443, b = 152.522683\n",
      "epoch 2670: loss = 1719679.350557, a = 943.904489, b = 152.522677\n",
      "epoch 2671: loss = 1719679.248786, a = 943.913518, b = 152.522672\n",
      "epoch 2672: loss = 1719679.147381, a = 943.922528, b = 152.522666\n",
      "epoch 2673: loss = 1719679.046340, a = 943.931520, b = 152.522660\n",
      "epoch 2674: loss = 1719678.945663, a = 943.940495, b = 152.522654\n",
      "epoch 2675: loss = 1719678.845348, a = 943.949451, b = 152.522649\n",
      "epoch 2676: loss = 1719678.745393, a = 943.958390, b = 152.522643\n",
      "epoch 2677: loss = 1719678.645798, a = 943.967311, b = 152.522637\n",
      "epoch 2678: loss = 1719678.546560, a = 943.976213, b = 152.522632\n",
      "epoch 2679: loss = 1719678.447679, a = 943.985098, b = 152.522626\n",
      "epoch 2680: loss = 1719678.349153, a = 943.993966, b = 152.522620\n",
      "epoch 2681: loss = 1719678.250981, a = 944.002815, b = 152.522615\n",
      "epoch 2682: loss = 1719678.153162, a = 944.011647, b = 152.522609\n",
      "epoch 2683: loss = 1719678.055694, a = 944.020461, b = 152.522603\n",
      "epoch 2684: loss = 1719677.958575, a = 944.029258, b = 152.522598\n",
      "epoch 2685: loss = 1719677.861805, a = 944.038037, b = 152.522592\n",
      "epoch 2686: loss = 1719677.765383, a = 944.046798, b = 152.522587\n",
      "epoch 2687: loss = 1719677.669306, a = 944.055542, b = 152.522581\n",
      "epoch 2688: loss = 1719677.573574, a = 944.064269, b = 152.522575\n",
      "epoch 2689: loss = 1719677.478185, a = 944.072978, b = 152.522570\n",
      "epoch 2690: loss = 1719677.383138, a = 944.081669, b = 152.522564\n",
      "epoch 2691: loss = 1719677.288432, a = 944.090343, b = 152.522559\n",
      "epoch 2692: loss = 1719677.194065, a = 944.099000, b = 152.522553\n",
      "epoch 2693: loss = 1719677.100036, a = 944.107640, b = 152.522548\n",
      "epoch 2694: loss = 1719677.006344, a = 944.116262, b = 152.522542\n",
      "epoch 2695: loss = 1719676.912988, a = 944.124867, b = 152.522537\n",
      "epoch 2696: loss = 1719676.819967, a = 944.133455, b = 152.522531\n",
      "epoch 2697: loss = 1719676.727278, a = 944.142025, b = 152.522526\n",
      "epoch 2698: loss = 1719676.634921, a = 944.150579, b = 152.522520\n",
      "epoch 2699: loss = 1719676.542895, a = 944.159115, b = 152.522515\n",
      "epoch 2700: loss = 1719676.451198, a = 944.167634, b = 152.522509\n",
      "epoch 2701: loss = 1719676.359830, a = 944.176137, b = 152.522504\n",
      "epoch 2702: loss = 1719676.268788, a = 944.184622, b = 152.522498\n",
      "epoch 2703: loss = 1719676.178072, a = 944.193090, b = 152.522493\n",
      "epoch 2704: loss = 1719676.087680, a = 944.201542, b = 152.522488\n",
      "epoch 2705: loss = 1719675.997611, a = 944.209976, b = 152.522482\n",
      "epoch 2706: loss = 1719675.907865, a = 944.218394, b = 152.522477\n",
      "epoch 2707: loss = 1719675.818439, a = 944.226794, b = 152.522472\n",
      "epoch 2708: loss = 1719675.729333, a = 944.235178, b = 152.522466\n",
      "epoch 2709: loss = 1719675.640545, a = 944.243546, b = 152.522461\n",
      "epoch 2710: loss = 1719675.552074, a = 944.251896, b = 152.522456\n",
      "epoch 2711: loss = 1719675.463919, a = 944.260230, b = 152.522450\n",
      "epoch 2712: loss = 1719675.376079, a = 944.268547, b = 152.522445\n",
      "epoch 2713: loss = 1719675.288553, a = 944.276847, b = 152.522440\n",
      "epoch 2714: loss = 1719675.201339, a = 944.285131, b = 152.522434\n",
      "epoch 2715: loss = 1719675.114437, a = 944.293399, b = 152.522429\n",
      "epoch 2716: loss = 1719675.027844, a = 944.301649, b = 152.522424\n",
      "epoch 2717: loss = 1719674.941560, a = 944.309884, b = 152.522418\n",
      "epoch 2718: loss = 1719674.855585, a = 944.318101, b = 152.522413\n",
      "epoch 2719: loss = 1719674.769915, a = 944.326303, b = 152.522408\n",
      "epoch 2720: loss = 1719674.684551, a = 944.334488, b = 152.522403\n",
      "epoch 2721: loss = 1719674.599492, a = 944.342656, b = 152.522398\n",
      "epoch 2722: loss = 1719674.514736, a = 944.350809, b = 152.522392\n",
      "epoch 2723: loss = 1719674.430281, a = 944.358945, b = 152.522387\n",
      "epoch 2724: loss = 1719674.346128, a = 944.367064, b = 152.522382\n",
      "epoch 2725: loss = 1719674.262274, a = 944.375168, b = 152.522377\n",
      "epoch 2726: loss = 1719674.178719, a = 944.383255, b = 152.522372\n",
      "epoch 2727: loss = 1719674.095462, a = 944.391326, b = 152.522366\n",
      "epoch 2728: loss = 1719674.012501, a = 944.399381, b = 152.522361\n",
      "epoch 2729: loss = 1719673.929835, a = 944.407420, b = 152.522356\n",
      "epoch 2730: loss = 1719673.847464, a = 944.415443, b = 152.522351\n",
      "epoch 2731: loss = 1719673.765385, a = 944.423450, b = 152.522346\n",
      "epoch 2732: loss = 1719673.683599, a = 944.431440, b = 152.522341\n",
      "epoch 2733: loss = 1719673.602103, a = 944.439415, b = 152.522336\n",
      "epoch 2734: loss = 1719673.520897, a = 944.447374, b = 152.522331\n",
      "epoch 2735: loss = 1719673.439980, a = 944.455317, b = 152.522326\n",
      "epoch 2736: loss = 1719673.359351, a = 944.463244, b = 152.522321\n",
      "epoch 2737: loss = 1719673.279008, a = 944.471155, b = 152.522315\n",
      "epoch 2738: loss = 1719673.198950, a = 944.479050, b = 152.522310\n",
      "epoch 2739: loss = 1719673.119177, a = 944.486930, b = 152.522305\n",
      "epoch 2740: loss = 1719673.039688, a = 944.494793, b = 152.522300\n",
      "epoch 2741: loss = 1719672.960480, a = 944.502642, b = 152.522295\n",
      "epoch 2742: loss = 1719672.881554, a = 944.510474, b = 152.522290\n",
      "epoch 2743: loss = 1719672.802908, a = 944.518291, b = 152.522285\n",
      "epoch 2744: loss = 1719672.724541, a = 944.526092, b = 152.522280\n",
      "epoch 2745: loss = 1719672.646452, a = 944.533877, b = 152.522275\n",
      "epoch 2746: loss = 1719672.568640, a = 944.541647, b = 152.522270\n",
      "epoch 2747: loss = 1719672.491105, a = 944.549401, b = 152.522266\n",
      "epoch 2748: loss = 1719672.413844, a = 944.557140, b = 152.522261\n",
      "epoch 2749: loss = 1719672.336857, a = 944.564864, b = 152.522256\n",
      "epoch 2750: loss = 1719672.260143, a = 944.572572, b = 152.522251\n",
      "epoch 2751: loss = 1719672.183701, a = 944.580264, b = 152.522246\n",
      "epoch 2752: loss = 1719672.107530, a = 944.587941, b = 152.522241\n",
      "epoch 2753: loss = 1719672.031629, a = 944.595603, b = 152.522236\n",
      "epoch 2754: loss = 1719671.955996, a = 944.603250, b = 152.522231\n",
      "epoch 2755: loss = 1719671.880631, a = 944.610881, b = 152.522226\n",
      "epoch 2756: loss = 1719671.805534, a = 944.618497, b = 152.522221\n",
      "epoch 2757: loss = 1719671.730702, a = 944.626097, b = 152.522217\n",
      "epoch 2758: loss = 1719671.656135, a = 944.633683, b = 152.522212\n",
      "epoch 2759: loss = 1719671.581832, a = 944.641253, b = 152.522207\n",
      "epoch 2760: loss = 1719671.507791, a = 944.648808, b = 152.522202\n",
      "epoch 2761: loss = 1719671.434013, a = 944.656348, b = 152.522197\n",
      "epoch 2762: loss = 1719671.360495, a = 944.663873, b = 152.522192\n",
      "epoch 2763: loss = 1719671.287238, a = 944.671383, b = 152.522188\n",
      "epoch 2764: loss = 1719671.214239, a = 944.678878, b = 152.522183\n",
      "epoch 2765: loss = 1719671.141498, a = 944.686358, b = 152.522178\n",
      "epoch 2766: loss = 1719671.069015, a = 944.693823, b = 152.522173\n",
      "epoch 2767: loss = 1719670.996787, a = 944.701273, b = 152.522169\n",
      "epoch 2768: loss = 1719670.924815, a = 944.708708, b = 152.522164\n",
      "epoch 2769: loss = 1719670.853097, a = 944.716129, b = 152.522159\n",
      "epoch 2770: loss = 1719670.781632, a = 944.723534, b = 152.522154\n",
      "epoch 2771: loss = 1719670.710419, a = 944.730925, b = 152.522150\n",
      "epoch 2772: loss = 1719670.639458, a = 944.738301, b = 152.522145\n",
      "epoch 2773: loss = 1719670.568747, a = 944.745662, b = 152.522140\n",
      "epoch 2774: loss = 1719670.498286, a = 944.753008, b = 152.522135\n",
      "epoch 2775: loss = 1719670.428073, a = 944.760340, b = 152.522131\n",
      "epoch 2776: loss = 1719670.358107, a = 944.767657, b = 152.522126\n",
      "epoch 2777: loss = 1719670.288389, a = 944.774959, b = 152.522121\n",
      "epoch 2778: loss = 1719670.218916, a = 944.782247, b = 152.522117\n",
      "epoch 2779: loss = 1719670.149688, a = 944.789521, b = 152.522112\n",
      "epoch 2780: loss = 1719670.080704, a = 944.796779, b = 152.522108\n",
      "epoch 2781: loss = 1719670.011963, a = 944.804023, b = 152.522103\n",
      "epoch 2782: loss = 1719669.943464, a = 944.811253, b = 152.522098\n",
      "epoch 2783: loss = 1719669.875206, a = 944.818468, b = 152.522094\n",
      "epoch 2784: loss = 1719669.807189, a = 944.825669, b = 152.522089\n",
      "epoch 2785: loss = 1719669.739411, a = 944.832856, b = 152.522084\n",
      "epoch 2786: loss = 1719669.671871, a = 944.840028, b = 152.522080\n",
      "epoch 2787: loss = 1719669.604569, a = 944.847185, b = 152.522075\n",
      "epoch 2788: loss = 1719669.537504, a = 944.854329, b = 152.522071\n",
      "epoch 2789: loss = 1719669.470675, a = 944.861458, b = 152.522066\n",
      "epoch 2790: loss = 1719669.404081, a = 944.868573, b = 152.522062\n",
      "epoch 2791: loss = 1719669.337721, a = 944.875673, b = 152.522057\n",
      "epoch 2792: loss = 1719669.271594, a = 944.882760, b = 152.522053\n",
      "epoch 2793: loss = 1719669.205700, a = 944.889832, b = 152.522048\n",
      "epoch 2794: loss = 1719669.140037, a = 944.896890, b = 152.522044\n",
      "epoch 2795: loss = 1719669.074604, a = 944.903934, b = 152.522039\n",
      "epoch 2796: loss = 1719669.009402, a = 944.910964, b = 152.522035\n",
      "epoch 2797: loss = 1719668.944428, a = 944.917980, b = 152.522030\n",
      "epoch 2798: loss = 1719668.879683, a = 944.924982, b = 152.522026\n",
      "epoch 2799: loss = 1719668.815165, a = 944.931970, b = 152.522021\n",
      "epoch 2800: loss = 1719668.750873, a = 944.938943, b = 152.522017\n",
      "epoch 2801: loss = 1719668.686807, a = 944.945903, b = 152.522012\n",
      "epoch 2802: loss = 1719668.622965, a = 944.952849, b = 152.522008\n",
      "epoch 2803: loss = 1719668.559348, a = 944.959781, b = 152.522003\n",
      "epoch 2804: loss = 1719668.495953, a = 944.966700, b = 152.521999\n",
      "epoch 2805: loss = 1719668.432781, a = 944.973604, b = 152.521995\n",
      "epoch 2806: loss = 1719668.369830, a = 944.980495, b = 152.521990\n",
      "epoch 2807: loss = 1719668.307100, a = 944.987371, b = 152.521986\n",
      "epoch 2808: loss = 1719668.244589, a = 944.994234, b = 152.521981\n",
      "epoch 2809: loss = 1719668.182297, a = 945.001084, b = 152.521977\n",
      "epoch 2810: loss = 1719668.120224, a = 945.007919, b = 152.521973\n",
      "epoch 2811: loss = 1719668.058368, a = 945.014741, b = 152.521968\n",
      "epoch 2812: loss = 1719667.996728, a = 945.021550, b = 152.521964\n",
      "epoch 2813: loss = 1719667.935304, a = 945.028344, b = 152.521960\n",
      "epoch 2814: loss = 1719667.874095, a = 945.035126, b = 152.521955\n",
      "epoch 2815: loss = 1719667.813100, a = 945.041893, b = 152.521951\n",
      "epoch 2816: loss = 1719667.752318, a = 945.048647, b = 152.521947\n",
      "epoch 2817: loss = 1719667.691749, a = 945.055388, b = 152.521942\n",
      "epoch 2818: loss = 1719667.631391, a = 945.062115, b = 152.521938\n",
      "epoch 2819: loss = 1719667.571245, a = 945.068828, b = 152.521934\n",
      "epoch 2820: loss = 1719667.511309, a = 945.075529, b = 152.521929\n",
      "epoch 2821: loss = 1719667.451582, a = 945.082215, b = 152.521925\n",
      "epoch 2822: loss = 1719667.392063, a = 945.088889, b = 152.521921\n",
      "epoch 2823: loss = 1719667.332753, a = 945.095549, b = 152.521917\n",
      "epoch 2824: loss = 1719667.273649, a = 945.102196, b = 152.521912\n",
      "epoch 2825: loss = 1719667.214752, a = 945.108829, b = 152.521908\n",
      "epoch 2826: loss = 1719667.156061, a = 945.115449, b = 152.521904\n",
      "epoch 2827: loss = 1719667.097574, a = 945.122056, b = 152.521900\n",
      "epoch 2828: loss = 1719667.039291, a = 945.128650, b = 152.521896\n",
      "epoch 2829: loss = 1719666.981211, a = 945.135230, b = 152.521891\n",
      "epoch 2830: loss = 1719666.923334, a = 945.141798, b = 152.521887\n",
      "epoch 2831: loss = 1719666.865659, a = 945.148352, b = 152.521883\n",
      "epoch 2832: loss = 1719666.808185, a = 945.154893, b = 152.521879\n",
      "epoch 2833: loss = 1719666.750911, a = 945.161421, b = 152.521875\n",
      "epoch 2834: loss = 1719666.693836, a = 945.167936, b = 152.521870\n",
      "epoch 2835: loss = 1719666.636960, a = 945.174438, b = 152.521866\n",
      "epoch 2836: loss = 1719666.580283, a = 945.180927, b = 152.521862\n",
      "epoch 2837: loss = 1719666.523802, a = 945.187403, b = 152.521858\n",
      "epoch 2838: loss = 1719666.467519, a = 945.193866, b = 152.521854\n",
      "epoch 2839: loss = 1719666.411431, a = 945.200317, b = 152.521850\n",
      "epoch 2840: loss = 1719666.355538, a = 945.206754, b = 152.521846\n",
      "epoch 2841: loss = 1719666.299839, a = 945.213178, b = 152.521842\n",
      "epoch 2842: loss = 1719666.244335, a = 945.219590, b = 152.521837\n",
      "epoch 2843: loss = 1719666.189023, a = 945.225988, b = 152.521833\n",
      "epoch 2844: loss = 1719666.133903, a = 945.232374, b = 152.521829\n",
      "epoch 2845: loss = 1719666.078976, a = 945.238747, b = 152.521825\n",
      "epoch 2846: loss = 1719666.024238, a = 945.245108, b = 152.521821\n",
      "epoch 2847: loss = 1719665.969691, a = 945.251456, b = 152.521817\n",
      "epoch 2848: loss = 1719665.915334, a = 945.257791, b = 152.521813\n",
      "epoch 2849: loss = 1719665.861165, a = 945.264113, b = 152.521809\n",
      "epoch 2850: loss = 1719665.807184, a = 945.270423, b = 152.521805\n",
      "epoch 2851: loss = 1719665.753391, a = 945.276720, b = 152.521801\n",
      "epoch 2852: loss = 1719665.699784, a = 945.283004, b = 152.521797\n",
      "epoch 2853: loss = 1719665.646364, a = 945.289276, b = 152.521793\n",
      "epoch 2854: loss = 1719665.593128, a = 945.295535, b = 152.521789\n",
      "epoch 2855: loss = 1719665.540077, a = 945.301782, b = 152.521785\n",
      "epoch 2856: loss = 1719665.487210, a = 945.308016, b = 152.521781\n",
      "epoch 2857: loss = 1719665.434526, a = 945.314238, b = 152.521777\n",
      "epoch 2858: loss = 1719665.382025, a = 945.320448, b = 152.521773\n",
      "epoch 2859: loss = 1719665.329706, a = 945.326645, b = 152.521769\n",
      "epoch 2860: loss = 1719665.277568, a = 945.332829, b = 152.521765\n",
      "epoch 2861: loss = 1719665.225610, a = 945.339002, b = 152.521761\n",
      "epoch 2862: loss = 1719665.173832, a = 945.345162, b = 152.521757\n",
      "epoch 2863: loss = 1719665.122234, a = 945.351309, b = 152.521753\n",
      "epoch 2864: loss = 1719665.070814, a = 945.357445, b = 152.521749\n",
      "epoch 2865: loss = 1719665.019572, a = 945.363568, b = 152.521746\n",
      "epoch 2866: loss = 1719664.968507, a = 945.369678, b = 152.521742\n",
      "epoch 2867: loss = 1719664.917619, a = 945.375777, b = 152.521738\n",
      "epoch 2868: loss = 1719664.866907, a = 945.381863, b = 152.521734\n",
      "epoch 2869: loss = 1719664.816370, a = 945.387938, b = 152.521730\n",
      "epoch 2870: loss = 1719664.766007, a = 945.394000, b = 152.521726\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "epoch 2871: loss = 1719664.715819, a = 945.400050, b = 152.521722\n",
      "epoch 2872: loss = 1719664.665804, a = 945.406087, b = 152.521718\n",
      "epoch 2873: loss = 1719664.615962, a = 945.412113, b = 152.521714\n",
      "epoch 2874: loss = 1719664.566291, a = 945.418127, b = 152.521711\n",
      "epoch 2875: loss = 1719664.516793, a = 945.424129, b = 152.521707\n",
      "epoch 2876: loss = 1719664.467465, a = 945.430118, b = 152.521703\n",
      "epoch 2877: loss = 1719664.418307, a = 945.436096, b = 152.521699\n",
      "epoch 2878: loss = 1719664.369319, a = 945.442062, b = 152.521695\n",
      "epoch 2879: loss = 1719664.320500, a = 945.448016, b = 152.521692\n",
      "epoch 2880: loss = 1719664.271849, a = 945.453958, b = 152.521688\n",
      "epoch 2881: loss = 1719664.223365, a = 945.459888, b = 152.521684\n",
      "epoch 2882: loss = 1719664.175049, a = 945.465806, b = 152.521680\n",
      "epoch 2883: loss = 1719664.126900, a = 945.471712, b = 152.521676\n",
      "epoch 2884: loss = 1719664.078916, a = 945.477607, b = 152.521673\n",
      "epoch 2885: loss = 1719664.031097, a = 945.483489, b = 152.521669\n",
      "epoch 2886: loss = 1719663.983443, a = 945.489360, b = 152.521665\n",
      "epoch 2887: loss = 1719663.935953, a = 945.495220, b = 152.521661\n",
      "epoch 2888: loss = 1719663.888627, a = 945.501067, b = 152.521658\n",
      "epoch 2889: loss = 1719663.841463, a = 945.506903, b = 152.521654\n",
      "epoch 2890: loss = 1719663.794462, a = 945.512727, b = 152.521650\n",
      "epoch 2891: loss = 1719663.747622, a = 945.518540, b = 152.521647\n",
      "epoch 2892: loss = 1719663.700944, a = 945.524341, b = 152.521643\n",
      "epoch 2893: loss = 1719663.654425, a = 945.530130, b = 152.521639\n",
      "epoch 2894: loss = 1719663.608067, a = 945.535908, b = 152.521635\n",
      "epoch 2895: loss = 1719663.561868, a = 945.541674, b = 152.521632\n",
      "epoch 2896: loss = 1719663.515827, a = 945.547429, b = 152.521628\n",
      "epoch 2897: loss = 1719663.469945, a = 945.553172, b = 152.521624\n",
      "epoch 2898: loss = 1719663.424220, a = 945.558903, b = 152.521621\n",
      "epoch 2899: loss = 1719663.378653, a = 945.564623, b = 152.521617\n",
      "epoch 2900: loss = 1719663.333241, a = 945.570332, b = 152.521613\n",
      "epoch 2901: loss = 1719663.287985, a = 945.576030, b = 152.521610\n",
      "epoch 2902: loss = 1719663.242885, a = 945.581716, b = 152.521606\n",
      "epoch 2903: loss = 1719663.197939, a = 945.587390, b = 152.521603\n",
      "epoch 2904: loss = 1719663.153148, a = 945.593053, b = 152.521599\n",
      "epoch 2905: loss = 1719663.108510, a = 945.598705, b = 152.521595\n",
      "epoch 2906: loss = 1719663.064024, a = 945.604346, b = 152.521592\n",
      "epoch 2907: loss = 1719663.019692, a = 945.609975, b = 152.521588\n",
      "epoch 2908: loss = 1719662.975511, a = 945.615593, b = 152.521585\n",
      "epoch 2909: loss = 1719662.931481, a = 945.621200, b = 152.521581\n",
      "epoch 2910: loss = 1719662.887602, a = 945.626796, b = 152.521577\n",
      "epoch 2911: loss = 1719662.843874, a = 945.632380, b = 152.521574\n",
      "epoch 2912: loss = 1719662.800295, a = 945.637953, b = 152.521570\n",
      "epoch 2913: loss = 1719662.756865, a = 945.643515, b = 152.521567\n",
      "epoch 2914: loss = 1719662.713583, a = 945.649066, b = 152.521563\n",
      "epoch 2915: loss = 1719662.670450, a = 945.654606, b = 152.521560\n",
      "epoch 2916: loss = 1719662.627464, a = 945.660135, b = 152.521556\n",
      "epoch 2917: loss = 1719662.584625, a = 945.665653, b = 152.521553\n",
      "epoch 2918: loss = 1719662.541932, a = 945.671160, b = 152.521549\n",
      "epoch 2919: loss = 1719662.499386, a = 945.676655, b = 152.521546\n",
      "epoch 2920: loss = 1719662.456984, a = 945.682140, b = 152.521542\n",
      "epoch 2921: loss = 1719662.414727, a = 945.687614, b = 152.521539\n",
      "epoch 2922: loss = 1719662.372615, a = 945.693077, b = 152.521535\n",
      "epoch 2923: loss = 1719662.330646, a = 945.698529, b = 152.521532\n",
      "epoch 2924: loss = 1719662.288821, a = 945.703970, b = 152.521528\n",
      "epoch 2925: loss = 1719662.247138, a = 945.709400, b = 152.521525\n",
      "epoch 2926: loss = 1719662.205597, a = 945.714819, b = 152.521521\n",
      "epoch 2927: loss = 1719662.164198, a = 945.720227, b = 152.521518\n",
      "epoch 2928: loss = 1719662.122941, a = 945.725625, b = 152.521514\n",
      "epoch 2929: loss = 1719662.081823, a = 945.731012, b = 152.521511\n",
      "epoch 2930: loss = 1719662.040846, a = 945.736388, b = 152.521507\n",
      "epoch 2931: loss = 1719662.000008, a = 945.741753, b = 152.521504\n",
      "epoch 2932: loss = 1719661.959310, a = 945.747108, b = 152.521501\n",
      "epoch 2933: loss = 1719661.918750, a = 945.752451, b = 152.521497\n",
      "epoch 2934: loss = 1719661.878328, a = 945.757785, b = 152.521494\n",
      "epoch 2935: loss = 1719661.838044, a = 945.763107, b = 152.521490\n",
      "epoch 2936: loss = 1719661.797896, a = 945.768419, b = 152.521487\n",
      "epoch 2937: loss = 1719661.757886, a = 945.773720, b = 152.521484\n",
      "epoch 2938: loss = 1719661.718011, a = 945.779011, b = 152.521480\n",
      "epoch 2939: loss = 1719661.678272, a = 945.784291, b = 152.521477\n",
      "epoch 2940: loss = 1719661.638668, a = 945.789560, b = 152.521473\n",
      "epoch 2941: loss = 1719661.599198, a = 945.794819, b = 152.521470\n",
      "epoch 2942: loss = 1719661.559863, a = 945.800068, b = 152.521467\n",
      "epoch 2943: loss = 1719661.520661, a = 945.805306, b = 152.521463\n",
      "epoch 2944: loss = 1719661.481592, a = 945.810533, b = 152.521460\n",
      "epoch 2945: loss = 1719661.442656, a = 945.815750, b = 152.521457\n",
      "epoch 2946: loss = 1719661.403852, a = 945.820957, b = 152.521453\n",
      "epoch 2947: loss = 1719661.365180, a = 945.826153, b = 152.521450\n",
      "epoch 2948: loss = 1719661.326639, a = 945.831339, b = 152.521447\n",
      "epoch 2949: loss = 1719661.288228, a = 945.836514, b = 152.521443\n",
      "epoch 2950: loss = 1719661.249948, a = 945.841679, b = 152.521440\n",
      "epoch 2951: loss = 1719661.211798, a = 945.846834, b = 152.521437\n",
      "epoch 2952: loss = 1719661.173777, a = 945.851978, b = 152.521434\n",
      "epoch 2953: loss = 1719661.135884, a = 945.857112, b = 152.521430\n",
      "epoch 2954: loss = 1719661.098120, a = 945.862236, b = 152.521427\n",
      "epoch 2955: loss = 1719661.060484, a = 945.867350, b = 152.521424\n",
      "epoch 2956: loss = 1719661.022975, a = 945.872453, b = 152.521420\n",
      "epoch 2957: loss = 1719660.985594, a = 945.877546, b = 152.521417\n",
      "epoch 2958: loss = 1719660.948338, a = 945.882629, b = 152.521414\n",
      "epoch 2959: loss = 1719660.911209, a = 945.887702, b = 152.521411\n",
      "epoch 2960: loss = 1719660.874205, a = 945.892765, b = 152.521408\n",
      "epoch 2961: loss = 1719660.837327, a = 945.897818, b = 152.521404\n",
      "epoch 2962: loss = 1719660.800573, a = 945.902860, b = 152.521401\n",
      "epoch 2963: loss = 1719660.763943, a = 945.907892, b = 152.521398\n",
      "epoch 2964: loss = 1719660.727437, a = 945.912915, b = 152.521395\n",
      "epoch 2965: loss = 1719660.691055, a = 945.917927, b = 152.521391\n",
      "epoch 2966: loss = 1719660.654795, a = 945.922929, b = 152.521388\n",
      "epoch 2967: loss = 1719660.618658, a = 945.927922, b = 152.521385\n",
      "epoch 2968: loss = 1719660.582642, a = 945.932904, b = 152.521382\n",
      "epoch 2969: loss = 1719660.546748, a = 945.937876, b = 152.521379\n",
      "epoch 2970: loss = 1719660.510975, a = 945.942839, b = 152.521376\n",
      "epoch 2971: loss = 1719660.475323, a = 945.947791, b = 152.521372\n",
      "epoch 2972: loss = 1719660.439791, a = 945.952734, b = 152.521369\n",
      "epoch 2973: loss = 1719660.404379, a = 945.957666, b = 152.521366\n",
      "epoch 2974: loss = 1719660.369086, a = 945.962589, b = 152.521363\n",
      "epoch 2975: loss = 1719660.333912, a = 945.967502, b = 152.521360\n",
      "epoch 2976: loss = 1719660.298857, a = 945.972405, b = 152.521357\n",
      "epoch 2977: loss = 1719660.263920, a = 945.977298, b = 152.521354\n",
      "epoch 2978: loss = 1719660.229100, a = 945.982182, b = 152.521350\n",
      "epoch 2979: loss = 1719660.194397, a = 945.987056, b = 152.521347\n",
      "epoch 2980: loss = 1719660.159811, a = 945.991920, b = 152.521344\n",
      "epoch 2981: loss = 1719660.125342, a = 945.996774, b = 152.521341\n",
      "epoch 2982: loss = 1719660.090988, a = 946.001619, b = 152.521338\n",
      "epoch 2983: loss = 1719660.056750, a = 946.006454, b = 152.521335\n",
      "epoch 2984: loss = 1719660.022627, a = 946.011279, b = 152.521332\n",
      "epoch 2985: loss = 1719659.988619, a = 946.016094, b = 152.521329\n",
      "epoch 2986: loss = 1719659.954725, a = 946.020900, b = 152.521326\n",
      "epoch 2987: loss = 1719659.920945, a = 946.025697, b = 152.521323\n",
      "epoch 2988: loss = 1719659.887278, a = 946.030483, b = 152.521320\n",
      "epoch 2989: loss = 1719659.853724, a = 946.035261, b = 152.521316\n",
      "epoch 2990: loss = 1719659.820283, a = 946.040028, b = 152.521313\n",
      "epoch 2991: loss = 1719659.786954, a = 946.044786, b = 152.521310\n",
      "epoch 2992: loss = 1719659.753737, a = 946.049535, b = 152.521307\n",
      "epoch 2993: loss = 1719659.720631, a = 946.054274, b = 152.521304\n",
      "epoch 2994: loss = 1719659.687636, a = 946.059004, b = 152.521301\n",
      "epoch 2995: loss = 1719659.654752, a = 946.063724, b = 152.521298\n",
      "epoch 2996: loss = 1719659.621978, a = 946.068434, b = 152.521295\n",
      "epoch 2997: loss = 1719659.589314, a = 946.073136, b = 152.521292\n",
      "epoch 2998: loss = 1719659.556759, a = 946.077828, b = 152.521289\n",
      "epoch 2999: loss = 1719659.524314, a = 946.082510, b = 152.521286\n"
     ]
    },
    {
     "data": {
      "image/png": "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c845x3G/0047jViZaiwzZsygoqLCVzs00WTagqVUkKmJxzT2aI8+AaSUSCl57bXXHPe9/fbbU9AiZ2bMmMFll11Gbm5uuptSr2msnm0myjo1zjQYjz4Z3tV9993Hsccey7HHHsuMcL6d9evX06lTJ6644gqOPfZYNmzYEFUw5O9//zudOnXi5JNPZujQodxzzz0ADB8+nLlz5wJGgZEJEybQo0cPunbtypo1awD46KOPOOmkkygoKKBPnz6sXWvvJVVWVnLJJZdw9NFHc/7551NZuffLdt1119GrVy+6dOnChAkTAHjggQf47rvv6N+/P/3791fup3GmsXq2KvlmumWdGnsahEefDO+qpKSEJ554gmXLliGl5MQTT+TUU0+lRYsWfPHFF8yaNYvevXtHHfPxxx8zb948VqxYQVVVFT169KBnz56W5z/ooIP45JNPePjhh7nnnnt47LHH6Ny5M++99x5NmjRh0aJF3HLLLXWZMa145JFHyM3NZfXq1axcuZIePXrUvXbHHXfQsmVLampqOP3001m5ciU33HAD9913H4sXL+aggw5S7tetWzdf96wx0Vg9W514rH7SIAx9olnzrHj//fc5//zz2WeffQAYMmQI7733HoMHD+awww6LM/IAS5Ys4bzzzqN58+Y0b96cc889V3n+IUOGANCzZ8+6dMbbt29n2LBhfPHFFwghqKqqsm3ju+++yw033ABAt27dogz0Cy+8wMyZM6murmbTpk18/vnnlgbc7X7JJNNUHG7a43bBUn3smx1a1umCzZvhzjuhaVO46650twZoIIY+1d6VafwTwUx3nJ2dTXV1NQC33nor/fv35+WXX2b9+vWcdtppvs799ddfc8899/Dxxx/TokULhg8fzq5du3zvl0wyLdbttj1uPNv62jcn9OpXBb/8AtOnwz33wM6dcO21ICUIke6WNYwYfTLihqeccgpFRUVUVFSwc+dOXn75ZU455RTbY/r27csrr7zCrl272LFjB6+++qqna27fvp38fOML9OSTTzruH5kK+bPPPqsrY/jzzz+zzz77cMABB/DDDz/w+uuv1x2z33778csvvzjulyoyLdbttj1uUurW175lAvVK0bRnD/zjH3D44TBhAvz61/DZZ/Dwwxlh5KGBePTJiBv26NGD4cOHc8IJJwBwzTXXUFBQwPr165XHHH/88Qwe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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "n_epoch = 3000          # epoch size\n",
    "a, b = 1, 1             # initial parameters\n",
    "epsilon = 0.001         # learning rate\n",
    "\n",
    "for i in range(n_epoch):\n",
    "    for j in range(N):\n",
    "        a = a + epsilon*2*(Y[j] - a*X[j] - b)*X[j]\n",
    "        b = b + epsilon*2*(Y[j] - a*X[j] - b)\n",
    "\n",
    "    L = 0\n",
    "    for j in range(N):\n",
    "        L = L + (Y[j]-a*X[j]-b)**2\n",
    "    print(\"epoch %4d: loss = %f, a = %f, b = %f\" % (i, L, a, b))\n",
    "    \n",
    "x_min = np.min(X)\n",
    "x_max = np.max(X)\n",
    "y_min = a * x_min + b\n",
    "y_max = a * x_max + b\n",
    "\n",
    "plt.scatter(X, Y, label='original data')\n",
    "plt.plot([x_min, x_max], [y_min, y_max], 'r', label='model')\n",
    "plt.legend()\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3. 如何可视化迭代过程"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "application/javascript": [
       "/* Put everything inside the global mpl namespace */\n",
       "window.mpl = {};\n",
       "\n",
       "\n",
       "mpl.get_websocket_type = function() {\n",
       "    if (typeof(WebSocket) !== 'undefined') {\n",
       "        return WebSocket;\n",
       "    } else if (typeof(MozWebSocket) !== 'undefined') {\n",
       "        return MozWebSocket;\n",
       "    } else {\n",
       "        alert('Your browser does not have WebSocket support.' +\n",
       "              'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
       "              'Firefox 4 and 5 are also supported but you ' +\n",
       "              'have to enable WebSockets in about:config.');\n",
       "    };\n",
       "}\n",
       "\n",
       "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
       "    this.id = figure_id;\n",
       "\n",
       "    this.ws = websocket;\n",
       "\n",
       "    this.supports_binary = (this.ws.binaryType != undefined);\n",
       "\n",
       "    if (!this.supports_binary) {\n",
       "        var warnings = document.getElementById(\"mpl-warnings\");\n",
       "        if (warnings) {\n",
       "            warnings.style.display = 'block';\n",
       "            warnings.textContent = (\n",
       "                \"This browser does not support binary websocket messages. \" +\n",
       "                    \"Performance may be slow.\");\n",
       "        }\n",
       "    }\n",
       "\n",
       "    this.imageObj = new Image();\n",
       "\n",
       "    this.context = undefined;\n",
       "    this.message = undefined;\n",
       "    this.canvas = undefined;\n",
       "    this.rubberband_canvas = undefined;\n",
       "    this.rubberband_context = undefined;\n",
       "    this.format_dropdown = undefined;\n",
       "\n",
       "    this.image_mode = 'full';\n",
       "\n",
       "    this.root = $('<div/>');\n",
       "    this._root_extra_style(this.root)\n",
       "    this.root.attr('style', 'display: inline-block');\n",
       "\n",
       "    $(parent_element).append(this.root);\n",
       "\n",
       "    this._init_header(this);\n",
       "    this._init_canvas(this);\n",
       "    this._init_toolbar(this);\n",
       "\n",
       "    var fig = this;\n",
       "\n",
       "    this.waiting = false;\n",
       "\n",
       "    this.ws.onopen =  function () {\n",
       "            fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
       "            fig.send_message(\"send_image_mode\", {});\n",
       "            if (mpl.ratio != 1) {\n",
       "                fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
       "            }\n",
       "            fig.send_message(\"refresh\", {});\n",
       "        }\n",
       "\n",
       "    this.imageObj.onload = function() {\n",
       "            if (fig.image_mode == 'full') {\n",
       "                // Full images could contain transparency (where diff images\n",
       "                // almost always do), so we need to clear the canvas so that\n",
       "                // there is no ghosting.\n",
       "                fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
       "            }\n",
       "            fig.context.drawImage(fig.imageObj, 0, 0);\n",
       "        };\n",
       "\n",
       "    this.imageObj.onunload = function() {\n",
       "        fig.ws.close();\n",
       "    }\n",
       "\n",
       "    this.ws.onmessage = this._make_on_message_function(this);\n",
       "\n",
       "    this.ondownload = ondownload;\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_header = function() {\n",
       "    var titlebar = $(\n",
       "        '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
       "        'ui-helper-clearfix\"/>');\n",
       "    var titletext = $(\n",
       "        '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
       "        'text-align: center; padding: 3px;\"/>');\n",
       "    titlebar.append(titletext)\n",
       "    this.root.append(titlebar);\n",
       "    this.header = titletext[0];\n",
       "}\n",
       "\n",
       "\n",
       "\n",
       "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
       "\n",
       "}\n",
       "\n",
       "\n",
       "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
       "\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_canvas = function() {\n",
       "    var fig = this;\n",
       "\n",
       "    var canvas_div = $('<div/>');\n",
       "\n",
       "    canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
       "\n",
       "    function canvas_keyboard_event(event) {\n",
       "        return fig.key_event(event, event['data']);\n",
       "    }\n",
       "\n",
       "    canvas_div.keydown('key_press', canvas_keyboard_event);\n",
       "    canvas_div.keyup('key_release', canvas_keyboard_event);\n",
       "    this.canvas_div = canvas_div\n",
       "    this._canvas_extra_style(canvas_div)\n",
       "    this.root.append(canvas_div);\n",
       "\n",
       "    var canvas = $('<canvas/>');\n",
       "    canvas.addClass('mpl-canvas');\n",
       "    canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
       "\n",
       "    this.canvas = canvas[0];\n",
       "    this.context = canvas[0].getContext(\"2d\");\n",
       "\n",
       "    var backingStore = this.context.backingStorePixelRatio ||\n",
       "\tthis.context.webkitBackingStorePixelRatio ||\n",
       "\tthis.context.mozBackingStorePixelRatio ||\n",
       "\tthis.context.msBackingStorePixelRatio ||\n",
       "\tthis.context.oBackingStorePixelRatio ||\n",
       "\tthis.context.backingStorePixelRatio || 1;\n",
       "\n",
       "    mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
       "\n",
       "    var rubberband = $('<canvas/>');\n",
       "    rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
       "\n",
       "    var pass_mouse_events = true;\n",
       "\n",
       "    canvas_div.resizable({\n",
       "        start: function(event, ui) {\n",
       "            pass_mouse_events = false;\n",
       "        },\n",
       "        resize: function(event, ui) {\n",
       "            fig.request_resize(ui.size.width, ui.size.height);\n",
       "        },\n",
       "        stop: function(event, ui) {\n",
       "            pass_mouse_events = true;\n",
       "            fig.request_resize(ui.size.width, ui.size.height);\n",
       "        },\n",
       "    });\n",
       "\n",
       "    function mouse_event_fn(event) {\n",
       "        if (pass_mouse_events)\n",
       "            return fig.mouse_event(event, event['data']);\n",
       "    }\n",
       "\n",
       "    rubberband.mousedown('button_press', mouse_event_fn);\n",
       "    rubberband.mouseup('button_release', mouse_event_fn);\n",
       "    // Throttle sequential mouse events to 1 every 20ms.\n",
       "    rubberband.mousemove('motion_notify', mouse_event_fn);\n",
       "\n",
       "    rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
       "    rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
       "\n",
       "    canvas_div.on(\"wheel\", function (event) {\n",
       "        event = event.originalEvent;\n",
       "        event['data'] = 'scroll'\n",
       "        if (event.deltaY < 0) {\n",
       "            event.step = 1;\n",
       "        } else {\n",
       "            event.step = -1;\n",
       "        }\n",
       "        mouse_event_fn(event);\n",
       "    });\n",
       "\n",
       "    canvas_div.append(canvas);\n",
       "    canvas_div.append(rubberband);\n",
       "\n",
       "    this.rubberband = rubberband;\n",
       "    this.rubberband_canvas = rubberband[0];\n",
       "    this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
       "    this.rubberband_context.strokeStyle = \"#000000\";\n",
       "\n",
       "    this._resize_canvas = function(width, height) {\n",
       "        // Keep the size of the canvas, canvas container, and rubber band\n",
       "        // canvas in synch.\n",
       "        canvas_div.css('width', width)\n",
       "        canvas_div.css('height', height)\n",
       "\n",
       "        canvas.attr('width', width * mpl.ratio);\n",
       "        canvas.attr('height', height * mpl.ratio);\n",
       "        canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
       "\n",
       "        rubberband.attr('width', width);\n",
       "        rubberband.attr('height', height);\n",
       "    }\n",
       "\n",
       "    // Set the figure to an initial 600x600px, this will subsequently be updated\n",
       "    // upon first draw.\n",
       "    this._resize_canvas(600, 600);\n",
       "\n",
       "    // Disable right mouse context menu.\n",
       "    $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
       "        return false;\n",
       "    });\n",
       "\n",
       "    function set_focus () {\n",
       "        canvas.focus();\n",
       "        canvas_div.focus();\n",
       "    }\n",
       "\n",
       "    window.setTimeout(set_focus, 100);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_toolbar = function() {\n",
       "    var fig = this;\n",
       "\n",
       "    var nav_element = $('<div/>')\n",
       "    nav_element.attr('style', 'width: 100%');\n",
       "    this.root.append(nav_element);\n",
       "\n",
       "    // Define a callback function for later on.\n",
       "    function toolbar_event(event) {\n",
       "        return fig.toolbar_button_onclick(event['data']);\n",
       "    }\n",
       "    function toolbar_mouse_event(event) {\n",
       "        return fig.toolbar_button_onmouseover(event['data']);\n",
       "    }\n",
       "\n",
       "    for(var toolbar_ind in mpl.toolbar_items) {\n",
       "        var name = mpl.toolbar_items[toolbar_ind][0];\n",
       "        var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
       "        var image = mpl.toolbar_items[toolbar_ind][2];\n",
       "        var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
       "\n",
       "        if (!name) {\n",
       "            // put a spacer in here.\n",
       "            continue;\n",
       "        }\n",
       "        var button = $('<button/>');\n",
       "        button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
       "                        'ui-button-icon-only');\n",
       "        button.attr('role', 'button');\n",
       "        button.attr('aria-disabled', 'false');\n",
       "        button.click(method_name, toolbar_event);\n",
       "        button.mouseover(tooltip, toolbar_mouse_event);\n",
       "\n",
       "        var icon_img = $('<span/>');\n",
       "        icon_img.addClass('ui-button-icon-primary ui-icon');\n",
       "        icon_img.addClass(image);\n",
       "        icon_img.addClass('ui-corner-all');\n",
       "\n",
       "        var tooltip_span = $('<span/>');\n",
       "        tooltip_span.addClass('ui-button-text');\n",
       "        tooltip_span.html(tooltip);\n",
       "\n",
       "        button.append(icon_img);\n",
       "        button.append(tooltip_span);\n",
       "\n",
       "        nav_element.append(button);\n",
       "    }\n",
       "\n",
       "    var fmt_picker_span = $('<span/>');\n",
       "\n",
       "    var fmt_picker = $('<select/>');\n",
       "    fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
       "    fmt_picker_span.append(fmt_picker);\n",
       "    nav_element.append(fmt_picker_span);\n",
       "    this.format_dropdown = fmt_picker[0];\n",
       "\n",
       "    for (var ind in mpl.extensions) {\n",
       "        var fmt = mpl.extensions[ind];\n",
       "        var option = $(\n",
       "            '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
       "        fmt_picker.append(option)\n",
       "    }\n",
       "\n",
       "    // Add hover states to the ui-buttons\n",
       "    $( \".ui-button\" ).hover(\n",
       "        function() { $(this).addClass(\"ui-state-hover\");},\n",
       "        function() { $(this).removeClass(\"ui-state-hover\");}\n",
       "    );\n",
       "\n",
       "    var status_bar = $('<span class=\"mpl-message\"/>');\n",
       "    nav_element.append(status_bar);\n",
       "    this.message = status_bar[0];\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
       "    // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
       "    // which will in turn request a refresh of the image.\n",
       "    this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.send_message = function(type, properties) {\n",
       "    properties['type'] = type;\n",
       "    properties['figure_id'] = this.id;\n",
       "    this.ws.send(JSON.stringify(properties));\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.send_draw_message = function() {\n",
       "    if (!this.waiting) {\n",
       "        this.waiting = true;\n",
       "        this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
       "    }\n",
       "}\n",
       "\n",
       "\n",
       "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
       "    var format_dropdown = fig.format_dropdown;\n",
       "    var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
       "    fig.ondownload(fig, format);\n",
       "}\n",
       "\n",
       "\n",
       "mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
       "    var size = msg['size'];\n",
       "    if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
       "        fig._resize_canvas(size[0], size[1]);\n",
       "        fig.send_message(\"refresh\", {});\n",
       "    };\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
       "    var x0 = msg['x0'] / mpl.ratio;\n",
       "    var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
       "    var x1 = msg['x1'] / mpl.ratio;\n",
       "    var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
       "    x0 = Math.floor(x0) + 0.5;\n",
       "    y0 = Math.floor(y0) + 0.5;\n",
       "    x1 = Math.floor(x1) + 0.5;\n",
       "    y1 = Math.floor(y1) + 0.5;\n",
       "    var min_x = Math.min(x0, x1);\n",
       "    var min_y = Math.min(y0, y1);\n",
       "    var width = Math.abs(x1 - x0);\n",
       "    var height = Math.abs(y1 - y0);\n",
       "\n",
       "    fig.rubberband_context.clearRect(\n",
       "        0, 0, fig.canvas.width, fig.canvas.height);\n",
       "\n",
       "    fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
       "    // Updates the figure title.\n",
       "    fig.header.textContent = msg['label'];\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
       "    var cursor = msg['cursor'];\n",
       "    switch(cursor)\n",
       "    {\n",
       "    case 0:\n",
       "        cursor = 'pointer';\n",
       "        break;\n",
       "    case 1:\n",
       "        cursor = 'default';\n",
       "        break;\n",
       "    case 2:\n",
       "        cursor = 'crosshair';\n",
       "        break;\n",
       "    case 3:\n",
       "        cursor = 'move';\n",
       "        break;\n",
       "    }\n",
       "    fig.rubberband_canvas.style.cursor = cursor;\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_message = function(fig, msg) {\n",
       "    fig.message.textContent = msg['message'];\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
       "    // Request the server to send over a new figure.\n",
       "    fig.send_draw_message();\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
       "    fig.image_mode = msg['mode'];\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.updated_canvas_event = function() {\n",
       "    // Called whenever the canvas gets updated.\n",
       "    this.send_message(\"ack\", {});\n",
       "}\n",
       "\n",
       "// A function to construct a web socket function for onmessage handling.\n",
       "// Called in the figure constructor.\n",
       "mpl.figure.prototype._make_on_message_function = function(fig) {\n",
       "    return function socket_on_message(evt) {\n",
       "        if (evt.data instanceof Blob) {\n",
       "            /* FIXME: We get \"Resource interpreted as Image but\n",
       "             * transferred with MIME type text/plain:\" errors on\n",
       "             * Chrome.  But how to set the MIME type?  It doesn't seem\n",
       "             * to be part of the websocket stream */\n",
       "            evt.data.type = \"image/png\";\n",
       "\n",
       "            /* Free the memory for the previous frames */\n",
       "            if (fig.imageObj.src) {\n",
       "                (window.URL || window.webkitURL).revokeObjectURL(\n",
       "                    fig.imageObj.src);\n",
       "            }\n",
       "\n",
       "            fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
       "                evt.data);\n",
       "            fig.updated_canvas_event();\n",
       "            fig.waiting = false;\n",
       "            return;\n",
       "        }\n",
       "        else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
       "            fig.imageObj.src = evt.data;\n",
       "            fig.updated_canvas_event();\n",
       "            fig.waiting = false;\n",
       "            return;\n",
       "        }\n",
       "\n",
       "        var msg = JSON.parse(evt.data);\n",
       "        var msg_type = msg['type'];\n",
       "\n",
       "        // Call the  \"handle_{type}\" callback, which takes\n",
       "        // the figure and JSON message as its only arguments.\n",
       "        try {\n",
       "            var callback = fig[\"handle_\" + msg_type];\n",
       "        } catch (e) {\n",
       "            console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
       "            return;\n",
       "        }\n",
       "\n",
       "        if (callback) {\n",
       "            try {\n",
       "                // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
       "                callback(fig, msg);\n",
       "            } catch (e) {\n",
       "                console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
       "            }\n",
       "        }\n",
       "    };\n",
       "}\n",
       "\n",
       "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
       "mpl.findpos = function(e) {\n",
       "    //this section is from http://www.quirksmode.org/js/events_properties.html\n",
       "    var targ;\n",
       "    if (!e)\n",
       "        e = window.event;\n",
       "    if (e.target)\n",
       "        targ = e.target;\n",
       "    else if (e.srcElement)\n",
       "        targ = e.srcElement;\n",
       "    if (targ.nodeType == 3) // defeat Safari bug\n",
       "        targ = targ.parentNode;\n",
       "\n",
       "    // jQuery normalizes the pageX and pageY\n",
       "    // pageX,Y are the mouse positions relative to the document\n",
       "    // offset() returns the position of the element relative to the document\n",
       "    var x = e.pageX - $(targ).offset().left;\n",
       "    var y = e.pageY - $(targ).offset().top;\n",
       "\n",
       "    return {\"x\": x, \"y\": y};\n",
       "};\n",
       "\n",
       "/*\n",
       " * return a copy of an object with only non-object keys\n",
       " * we need this to avoid circular references\n",
       " * http://stackoverflow.com/a/24161582/3208463\n",
       " */\n",
       "function simpleKeys (original) {\n",
       "  return Object.keys(original).reduce(function (obj, key) {\n",
       "    if (typeof original[key] !== 'object')\n",
       "        obj[key] = original[key]\n",
       "    return obj;\n",
       "  }, {});\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.mouse_event = function(event, name) {\n",
       "    var canvas_pos = mpl.findpos(event)\n",
       "\n",
       "    if (name === 'button_press')\n",
       "    {\n",
       "        this.canvas.focus();\n",
       "        this.canvas_div.focus();\n",
       "    }\n",
       "\n",
       "    var x = canvas_pos.x * mpl.ratio;\n",
       "    var y = canvas_pos.y * mpl.ratio;\n",
       "\n",
       "    this.send_message(name, {x: x, y: y, button: event.button,\n",
       "                             step: event.step,\n",
       "                             guiEvent: simpleKeys(event)});\n",
       "\n",
       "    /* This prevents the web browser from automatically changing to\n",
       "     * the text insertion cursor when the button is pressed.  We want\n",
       "     * to control all of the cursor setting manually through the\n",
       "     * 'cursor' event from matplotlib */\n",
       "    event.preventDefault();\n",
       "    return false;\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
       "    // Handle any extra behaviour associated with a key event\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.key_event = function(event, name) {\n",
       "\n",
       "    // Prevent repeat events\n",
       "    if (name == 'key_press')\n",
       "    {\n",
       "        if (event.which === this._key)\n",
       "            return;\n",
       "        else\n",
       "            this._key = event.which;\n",
       "    }\n",
       "    if (name == 'key_release')\n",
       "        this._key = null;\n",
       "\n",
       "    var value = '';\n",
       "    if (event.ctrlKey && event.which != 17)\n",
       "        value += \"ctrl+\";\n",
       "    if (event.altKey && event.which != 18)\n",
       "        value += \"alt+\";\n",
       "    if (event.shiftKey && event.which != 16)\n",
       "        value += \"shift+\";\n",
       "\n",
       "    value += 'k';\n",
       "    value += event.which.toString();\n",
       "\n",
       "    this._key_event_extra(event, name);\n",
       "\n",
       "    this.send_message(name, {key: value,\n",
       "                             guiEvent: simpleKeys(event)});\n",
       "    return false;\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
       "    if (name == 'download') {\n",
       "        this.handle_save(this, null);\n",
       "    } else {\n",
       "        this.send_message(\"toolbar_button\", {name: name});\n",
       "    }\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
       "    this.message.textContent = tooltip;\n",
       "};\n",
       "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
       "\n",
       "mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
       "\n",
       "mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
       "    // Create a \"websocket\"-like object which calls the given IPython comm\n",
       "    // object with the appropriate methods. Currently this is a non binary\n",
       "    // socket, so there is still some room for performance tuning.\n",
       "    var ws = {};\n",
       "\n",
       "    ws.close = function() {\n",
       "        comm.close()\n",
       "    };\n",
       "    ws.send = function(m) {\n",
       "        //console.log('sending', m);\n",
       "        comm.send(m);\n",
       "    };\n",
       "    // Register the callback with on_msg.\n",
       "    comm.on_msg(function(msg) {\n",
       "        //console.log('receiving', msg['content']['data'], msg);\n",
       "        // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
       "        ws.onmessage(msg['content']['data'])\n",
       "    });\n",
       "    return ws;\n",
       "}\n",
       "\n",
       "mpl.mpl_figure_comm = function(comm, msg) {\n",
       "    // This is the function which gets called when the mpl process\n",
       "    // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
       "\n",
       "    var id = msg.content.data.id;\n",
       "    // Get hold of the div created by the display call when the Comm\n",
       "    // socket was opened in Python.\n",
       "    var element = $(\"#\" + id);\n",
       "    var ws_proxy = comm_websocket_adapter(comm)\n",
       "\n",
       "    function ondownload(figure, format) {\n",
       "        window.open(figure.imageObj.src);\n",
       "    }\n",
       "\n",
       "    var fig = new mpl.figure(id, ws_proxy,\n",
       "                           ondownload,\n",
       "                           element.get(0));\n",
       "\n",
       "    // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
       "    // web socket which is closed, not our websocket->open comm proxy.\n",
       "    ws_proxy.onopen();\n",
       "\n",
       "    fig.parent_element = element.get(0);\n",
       "    fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
       "    if (!fig.cell_info) {\n",
       "        console.error(\"Failed to find cell for figure\", id, fig);\n",
       "        return;\n",
       "    }\n",
       "\n",
       "    var output_index = fig.cell_info[2]\n",
       "    var cell = fig.cell_info[0];\n",
       "\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_close = function(fig, msg) {\n",
       "    var width = fig.canvas.width/mpl.ratio\n",
       "    fig.root.unbind('remove')\n",
       "\n",
       "    // Update the output cell to use the data from the current canvas.\n",
       "    fig.push_to_output();\n",
       "    var dataURL = fig.canvas.toDataURL();\n",
       "    // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
       "    // the notebook keyboard shortcuts fail.\n",
       "    IPython.keyboard_manager.enable()\n",
       "    $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n",
       "    fig.close_ws(fig, msg);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.close_ws = function(fig, msg){\n",
       "    fig.send_message('closing', msg);\n",
       "    // fig.ws.close()\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
       "    // Turn the data on the canvas into data in the output cell.\n",
       "    var width = this.canvas.width/mpl.ratio\n",
       "    var dataURL = this.canvas.toDataURL();\n",
       "    this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.updated_canvas_event = function() {\n",
       "    // Tell IPython that the notebook contents must change.\n",
       "    IPython.notebook.set_dirty(true);\n",
       "    this.send_message(\"ack\", {});\n",
       "    var fig = this;\n",
       "    // Wait a second, then push the new image to the DOM so\n",
       "    // that it is saved nicely (might be nice to debounce this).\n",
       "    setTimeout(function () { fig.push_to_output() }, 1000);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_toolbar = function() {\n",
       "    var fig = this;\n",
       "\n",
       "    var nav_element = $('<div/>')\n",
       "    nav_element.attr('style', 'width: 100%');\n",
       "    this.root.append(nav_element);\n",
       "\n",
       "    // Define a callback function for later on.\n",
       "    function toolbar_event(event) {\n",
       "        return fig.toolbar_button_onclick(event['data']);\n",
       "    }\n",
       "    function toolbar_mouse_event(event) {\n",
       "        return fig.toolbar_button_onmouseover(event['data']);\n",
       "    }\n",
       "\n",
       "    for(var toolbar_ind in mpl.toolbar_items){\n",
       "        var name = mpl.toolbar_items[toolbar_ind][0];\n",
       "        var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
       "        var image = mpl.toolbar_items[toolbar_ind][2];\n",
       "        var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
       "\n",
       "        if (!name) { continue; };\n",
       "\n",
       "        var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
       "        button.click(method_name, toolbar_event);\n",
       "        button.mouseover(tooltip, toolbar_mouse_event);\n",
       "        nav_element.append(button);\n",
       "    }\n",
       "\n",
       "    // Add the status bar.\n",
       "    var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
       "    nav_element.append(status_bar);\n",
       "    this.message = status_bar[0];\n",
       "\n",
       "    // Add the close button to the window.\n",
       "    var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
       "    var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
       "    button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
       "    button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
       "    buttongrp.append(button);\n",
       "    var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
       "    titlebar.prepend(buttongrp);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._root_extra_style = function(el){\n",
       "    var fig = this\n",
       "    el.on(\"remove\", function(){\n",
       "\tfig.close_ws(fig, {});\n",
       "    });\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._canvas_extra_style = function(el){\n",
       "    // this is important to make the div 'focusable\n",
       "    el.attr('tabindex', 0)\n",
       "    // reach out to IPython and tell the keyboard manager to turn it's self\n",
       "    // off when our div gets focus\n",
       "\n",
       "    // location in version 3\n",
       "    if (IPython.notebook.keyboard_manager) {\n",
       "        IPython.notebook.keyboard_manager.register_events(el);\n",
       "    }\n",
       "    else {\n",
       "        // location in version 2\n",
       "        IPython.keyboard_manager.register_events(el);\n",
       "    }\n",
       "\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
       "    var manager = IPython.notebook.keyboard_manager;\n",
       "    if (!manager)\n",
       "        manager = IPython.keyboard_manager;\n",
       "\n",
       "    // Check for shift+enter\n",
       "    if (event.shiftKey && event.which == 13) {\n",
       "        this.canvas_div.blur();\n",
       "        event.shiftKey = false;\n",
       "        // Send a \"J\" for go to next cell\n",
       "        event.which = 74;\n",
       "        event.keyCode = 74;\n",
       "        manager.command_mode();\n",
       "        manager.handle_keydown(event);\n",
       "    }\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
       "    fig.ondownload(fig, null);\n",
       "}\n",
       "\n",
       "\n",
       "mpl.find_output_cell = function(html_output) {\n",
       "    // Return the cell and output element which can be found *uniquely* in the notebook.\n",
       "    // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
       "    // IPython event is triggered only after the cells have been serialised, which for\n",
       "    // our purposes (turning an active figure into a static one), is too late.\n",
       "    var cells = IPython.notebook.get_cells();\n",
       "    var ncells = cells.length;\n",
       "    for (var i=0; i<ncells; i++) {\n",
       "        var cell = cells[i];\n",
       "        if (cell.cell_type === 'code'){\n",
       "            for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
       "                var data = cell.output_area.outputs[j];\n",
       "                if (data.data) {\n",
       "                    // IPython >= 3 moved mimebundle to data attribute of output\n",
       "                    data = data.data;\n",
       "                }\n",
       "                if (data['text/html'] == html_output) {\n",
       "                    return [cell, data, j];\n",
       "                }\n",
       "            }\n",
       "        }\n",
       "    }\n",
       "}\n",
       "\n",
       "// Register the function which deals with the matplotlib target/channel.\n",
       "// The kernel may be null if the page has been refreshed.\n",
       "if (IPython.notebook.kernel != null) {\n",
       "    IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
       "}\n"
      ],
      "text/plain": [
       "<IPython.core.display.Javascript object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<img src=\"\" width=\"432\">"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "application/javascript": [
       "/* Put everything inside the global mpl namespace */\n",
       "window.mpl = {};\n",
       "\n",
       "\n",
       "mpl.get_websocket_type = function() {\n",
       "    if (typeof(WebSocket) !== 'undefined') {\n",
       "        return WebSocket;\n",
       "    } else if (typeof(MozWebSocket) !== 'undefined') {\n",
       "        return MozWebSocket;\n",
       "    } else {\n",
       "        alert('Your browser does not have WebSocket support.' +\n",
       "              'Please try Chrome, Safari or Firefox ≥ 6. ' +\n",
       "              'Firefox 4 and 5 are also supported but you ' +\n",
       "              'have to enable WebSockets in about:config.');\n",
       "    };\n",
       "}\n",
       "\n",
       "mpl.figure = function(figure_id, websocket, ondownload, parent_element) {\n",
       "    this.id = figure_id;\n",
       "\n",
       "    this.ws = websocket;\n",
       "\n",
       "    this.supports_binary = (this.ws.binaryType != undefined);\n",
       "\n",
       "    if (!this.supports_binary) {\n",
       "        var warnings = document.getElementById(\"mpl-warnings\");\n",
       "        if (warnings) {\n",
       "            warnings.style.display = 'block';\n",
       "            warnings.textContent = (\n",
       "                \"This browser does not support binary websocket messages. \" +\n",
       "                    \"Performance may be slow.\");\n",
       "        }\n",
       "    }\n",
       "\n",
       "    this.imageObj = new Image();\n",
       "\n",
       "    this.context = undefined;\n",
       "    this.message = undefined;\n",
       "    this.canvas = undefined;\n",
       "    this.rubberband_canvas = undefined;\n",
       "    this.rubberband_context = undefined;\n",
       "    this.format_dropdown = undefined;\n",
       "\n",
       "    this.image_mode = 'full';\n",
       "\n",
       "    this.root = $('<div/>');\n",
       "    this._root_extra_style(this.root)\n",
       "    this.root.attr('style', 'display: inline-block');\n",
       "\n",
       "    $(parent_element).append(this.root);\n",
       "\n",
       "    this._init_header(this);\n",
       "    this._init_canvas(this);\n",
       "    this._init_toolbar(this);\n",
       "\n",
       "    var fig = this;\n",
       "\n",
       "    this.waiting = false;\n",
       "\n",
       "    this.ws.onopen =  function () {\n",
       "            fig.send_message(\"supports_binary\", {value: fig.supports_binary});\n",
       "            fig.send_message(\"send_image_mode\", {});\n",
       "            if (mpl.ratio != 1) {\n",
       "                fig.send_message(\"set_dpi_ratio\", {'dpi_ratio': mpl.ratio});\n",
       "            }\n",
       "            fig.send_message(\"refresh\", {});\n",
       "        }\n",
       "\n",
       "    this.imageObj.onload = function() {\n",
       "            if (fig.image_mode == 'full') {\n",
       "                // Full images could contain transparency (where diff images\n",
       "                // almost always do), so we need to clear the canvas so that\n",
       "                // there is no ghosting.\n",
       "                fig.context.clearRect(0, 0, fig.canvas.width, fig.canvas.height);\n",
       "            }\n",
       "            fig.context.drawImage(fig.imageObj, 0, 0);\n",
       "        };\n",
       "\n",
       "    this.imageObj.onunload = function() {\n",
       "        fig.ws.close();\n",
       "    }\n",
       "\n",
       "    this.ws.onmessage = this._make_on_message_function(this);\n",
       "\n",
       "    this.ondownload = ondownload;\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_header = function() {\n",
       "    var titlebar = $(\n",
       "        '<div class=\"ui-dialog-titlebar ui-widget-header ui-corner-all ' +\n",
       "        'ui-helper-clearfix\"/>');\n",
       "    var titletext = $(\n",
       "        '<div class=\"ui-dialog-title\" style=\"width: 100%; ' +\n",
       "        'text-align: center; padding: 3px;\"/>');\n",
       "    titlebar.append(titletext)\n",
       "    this.root.append(titlebar);\n",
       "    this.header = titletext[0];\n",
       "}\n",
       "\n",
       "\n",
       "\n",
       "mpl.figure.prototype._canvas_extra_style = function(canvas_div) {\n",
       "\n",
       "}\n",
       "\n",
       "\n",
       "mpl.figure.prototype._root_extra_style = function(canvas_div) {\n",
       "\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_canvas = function() {\n",
       "    var fig = this;\n",
       "\n",
       "    var canvas_div = $('<div/>');\n",
       "\n",
       "    canvas_div.attr('style', 'position: relative; clear: both; outline: 0');\n",
       "\n",
       "    function canvas_keyboard_event(event) {\n",
       "        return fig.key_event(event, event['data']);\n",
       "    }\n",
       "\n",
       "    canvas_div.keydown('key_press', canvas_keyboard_event);\n",
       "    canvas_div.keyup('key_release', canvas_keyboard_event);\n",
       "    this.canvas_div = canvas_div\n",
       "    this._canvas_extra_style(canvas_div)\n",
       "    this.root.append(canvas_div);\n",
       "\n",
       "    var canvas = $('<canvas/>');\n",
       "    canvas.addClass('mpl-canvas');\n",
       "    canvas.attr('style', \"left: 0; top: 0; z-index: 0; outline: 0\")\n",
       "\n",
       "    this.canvas = canvas[0];\n",
       "    this.context = canvas[0].getContext(\"2d\");\n",
       "\n",
       "    var backingStore = this.context.backingStorePixelRatio ||\n",
       "\tthis.context.webkitBackingStorePixelRatio ||\n",
       "\tthis.context.mozBackingStorePixelRatio ||\n",
       "\tthis.context.msBackingStorePixelRatio ||\n",
       "\tthis.context.oBackingStorePixelRatio ||\n",
       "\tthis.context.backingStorePixelRatio || 1;\n",
       "\n",
       "    mpl.ratio = (window.devicePixelRatio || 1) / backingStore;\n",
       "\n",
       "    var rubberband = $('<canvas/>');\n",
       "    rubberband.attr('style', \"position: absolute; left: 0; top: 0; z-index: 1;\")\n",
       "\n",
       "    var pass_mouse_events = true;\n",
       "\n",
       "    canvas_div.resizable({\n",
       "        start: function(event, ui) {\n",
       "            pass_mouse_events = false;\n",
       "        },\n",
       "        resize: function(event, ui) {\n",
       "            fig.request_resize(ui.size.width, ui.size.height);\n",
       "        },\n",
       "        stop: function(event, ui) {\n",
       "            pass_mouse_events = true;\n",
       "            fig.request_resize(ui.size.width, ui.size.height);\n",
       "        },\n",
       "    });\n",
       "\n",
       "    function mouse_event_fn(event) {\n",
       "        if (pass_mouse_events)\n",
       "            return fig.mouse_event(event, event['data']);\n",
       "    }\n",
       "\n",
       "    rubberband.mousedown('button_press', mouse_event_fn);\n",
       "    rubberband.mouseup('button_release', mouse_event_fn);\n",
       "    // Throttle sequential mouse events to 1 every 20ms.\n",
       "    rubberband.mousemove('motion_notify', mouse_event_fn);\n",
       "\n",
       "    rubberband.mouseenter('figure_enter', mouse_event_fn);\n",
       "    rubberband.mouseleave('figure_leave', mouse_event_fn);\n",
       "\n",
       "    canvas_div.on(\"wheel\", function (event) {\n",
       "        event = event.originalEvent;\n",
       "        event['data'] = 'scroll'\n",
       "        if (event.deltaY < 0) {\n",
       "            event.step = 1;\n",
       "        } else {\n",
       "            event.step = -1;\n",
       "        }\n",
       "        mouse_event_fn(event);\n",
       "    });\n",
       "\n",
       "    canvas_div.append(canvas);\n",
       "    canvas_div.append(rubberband);\n",
       "\n",
       "    this.rubberband = rubberband;\n",
       "    this.rubberband_canvas = rubberband[0];\n",
       "    this.rubberband_context = rubberband[0].getContext(\"2d\");\n",
       "    this.rubberband_context.strokeStyle = \"#000000\";\n",
       "\n",
       "    this._resize_canvas = function(width, height) {\n",
       "        // Keep the size of the canvas, canvas container, and rubber band\n",
       "        // canvas in synch.\n",
       "        canvas_div.css('width', width)\n",
       "        canvas_div.css('height', height)\n",
       "\n",
       "        canvas.attr('width', width * mpl.ratio);\n",
       "        canvas.attr('height', height * mpl.ratio);\n",
       "        canvas.attr('style', 'width: ' + width + 'px; height: ' + height + 'px;');\n",
       "\n",
       "        rubberband.attr('width', width);\n",
       "        rubberband.attr('height', height);\n",
       "    }\n",
       "\n",
       "    // Set the figure to an initial 600x600px, this will subsequently be updated\n",
       "    // upon first draw.\n",
       "    this._resize_canvas(600, 600);\n",
       "\n",
       "    // Disable right mouse context menu.\n",
       "    $(this.rubberband_canvas).bind(\"contextmenu\",function(e){\n",
       "        return false;\n",
       "    });\n",
       "\n",
       "    function set_focus () {\n",
       "        canvas.focus();\n",
       "        canvas_div.focus();\n",
       "    }\n",
       "\n",
       "    window.setTimeout(set_focus, 100);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_toolbar = function() {\n",
       "    var fig = this;\n",
       "\n",
       "    var nav_element = $('<div/>')\n",
       "    nav_element.attr('style', 'width: 100%');\n",
       "    this.root.append(nav_element);\n",
       "\n",
       "    // Define a callback function for later on.\n",
       "    function toolbar_event(event) {\n",
       "        return fig.toolbar_button_onclick(event['data']);\n",
       "    }\n",
       "    function toolbar_mouse_event(event) {\n",
       "        return fig.toolbar_button_onmouseover(event['data']);\n",
       "    }\n",
       "\n",
       "    for(var toolbar_ind in mpl.toolbar_items) {\n",
       "        var name = mpl.toolbar_items[toolbar_ind][0];\n",
       "        var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
       "        var image = mpl.toolbar_items[toolbar_ind][2];\n",
       "        var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
       "\n",
       "        if (!name) {\n",
       "            // put a spacer in here.\n",
       "            continue;\n",
       "        }\n",
       "        var button = $('<button/>');\n",
       "        button.addClass('ui-button ui-widget ui-state-default ui-corner-all ' +\n",
       "                        'ui-button-icon-only');\n",
       "        button.attr('role', 'button');\n",
       "        button.attr('aria-disabled', 'false');\n",
       "        button.click(method_name, toolbar_event);\n",
       "        button.mouseover(tooltip, toolbar_mouse_event);\n",
       "\n",
       "        var icon_img = $('<span/>');\n",
       "        icon_img.addClass('ui-button-icon-primary ui-icon');\n",
       "        icon_img.addClass(image);\n",
       "        icon_img.addClass('ui-corner-all');\n",
       "\n",
       "        var tooltip_span = $('<span/>');\n",
       "        tooltip_span.addClass('ui-button-text');\n",
       "        tooltip_span.html(tooltip);\n",
       "\n",
       "        button.append(icon_img);\n",
       "        button.append(tooltip_span);\n",
       "\n",
       "        nav_element.append(button);\n",
       "    }\n",
       "\n",
       "    var fmt_picker_span = $('<span/>');\n",
       "\n",
       "    var fmt_picker = $('<select/>');\n",
       "    fmt_picker.addClass('mpl-toolbar-option ui-widget ui-widget-content');\n",
       "    fmt_picker_span.append(fmt_picker);\n",
       "    nav_element.append(fmt_picker_span);\n",
       "    this.format_dropdown = fmt_picker[0];\n",
       "\n",
       "    for (var ind in mpl.extensions) {\n",
       "        var fmt = mpl.extensions[ind];\n",
       "        var option = $(\n",
       "            '<option/>', {selected: fmt === mpl.default_extension}).html(fmt);\n",
       "        fmt_picker.append(option)\n",
       "    }\n",
       "\n",
       "    // Add hover states to the ui-buttons\n",
       "    $( \".ui-button\" ).hover(\n",
       "        function() { $(this).addClass(\"ui-state-hover\");},\n",
       "        function() { $(this).removeClass(\"ui-state-hover\");}\n",
       "    );\n",
       "\n",
       "    var status_bar = $('<span class=\"mpl-message\"/>');\n",
       "    nav_element.append(status_bar);\n",
       "    this.message = status_bar[0];\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.request_resize = function(x_pixels, y_pixels) {\n",
       "    // Request matplotlib to resize the figure. Matplotlib will then trigger a resize in the client,\n",
       "    // which will in turn request a refresh of the image.\n",
       "    this.send_message('resize', {'width': x_pixels, 'height': y_pixels});\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.send_message = function(type, properties) {\n",
       "    properties['type'] = type;\n",
       "    properties['figure_id'] = this.id;\n",
       "    this.ws.send(JSON.stringify(properties));\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.send_draw_message = function() {\n",
       "    if (!this.waiting) {\n",
       "        this.waiting = true;\n",
       "        this.ws.send(JSON.stringify({type: \"draw\", figure_id: this.id}));\n",
       "    }\n",
       "}\n",
       "\n",
       "\n",
       "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
       "    var format_dropdown = fig.format_dropdown;\n",
       "    var format = format_dropdown.options[format_dropdown.selectedIndex].value;\n",
       "    fig.ondownload(fig, format);\n",
       "}\n",
       "\n",
       "\n",
       "mpl.figure.prototype.handle_resize = function(fig, msg) {\n",
       "    var size = msg['size'];\n",
       "    if (size[0] != fig.canvas.width || size[1] != fig.canvas.height) {\n",
       "        fig._resize_canvas(size[0], size[1]);\n",
       "        fig.send_message(\"refresh\", {});\n",
       "    };\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_rubberband = function(fig, msg) {\n",
       "    var x0 = msg['x0'] / mpl.ratio;\n",
       "    var y0 = (fig.canvas.height - msg['y0']) / mpl.ratio;\n",
       "    var x1 = msg['x1'] / mpl.ratio;\n",
       "    var y1 = (fig.canvas.height - msg['y1']) / mpl.ratio;\n",
       "    x0 = Math.floor(x0) + 0.5;\n",
       "    y0 = Math.floor(y0) + 0.5;\n",
       "    x1 = Math.floor(x1) + 0.5;\n",
       "    y1 = Math.floor(y1) + 0.5;\n",
       "    var min_x = Math.min(x0, x1);\n",
       "    var min_y = Math.min(y0, y1);\n",
       "    var width = Math.abs(x1 - x0);\n",
       "    var height = Math.abs(y1 - y0);\n",
       "\n",
       "    fig.rubberband_context.clearRect(\n",
       "        0, 0, fig.canvas.width, fig.canvas.height);\n",
       "\n",
       "    fig.rubberband_context.strokeRect(min_x, min_y, width, height);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_figure_label = function(fig, msg) {\n",
       "    // Updates the figure title.\n",
       "    fig.header.textContent = msg['label'];\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_cursor = function(fig, msg) {\n",
       "    var cursor = msg['cursor'];\n",
       "    switch(cursor)\n",
       "    {\n",
       "    case 0:\n",
       "        cursor = 'pointer';\n",
       "        break;\n",
       "    case 1:\n",
       "        cursor = 'default';\n",
       "        break;\n",
       "    case 2:\n",
       "        cursor = 'crosshair';\n",
       "        break;\n",
       "    case 3:\n",
       "        cursor = 'move';\n",
       "        break;\n",
       "    }\n",
       "    fig.rubberband_canvas.style.cursor = cursor;\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_message = function(fig, msg) {\n",
       "    fig.message.textContent = msg['message'];\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_draw = function(fig, msg) {\n",
       "    // Request the server to send over a new figure.\n",
       "    fig.send_draw_message();\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_image_mode = function(fig, msg) {\n",
       "    fig.image_mode = msg['mode'];\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.updated_canvas_event = function() {\n",
       "    // Called whenever the canvas gets updated.\n",
       "    this.send_message(\"ack\", {});\n",
       "}\n",
       "\n",
       "// A function to construct a web socket function for onmessage handling.\n",
       "// Called in the figure constructor.\n",
       "mpl.figure.prototype._make_on_message_function = function(fig) {\n",
       "    return function socket_on_message(evt) {\n",
       "        if (evt.data instanceof Blob) {\n",
       "            /* FIXME: We get \"Resource interpreted as Image but\n",
       "             * transferred with MIME type text/plain:\" errors on\n",
       "             * Chrome.  But how to set the MIME type?  It doesn't seem\n",
       "             * to be part of the websocket stream */\n",
       "            evt.data.type = \"image/png\";\n",
       "\n",
       "            /* Free the memory for the previous frames */\n",
       "            if (fig.imageObj.src) {\n",
       "                (window.URL || window.webkitURL).revokeObjectURL(\n",
       "                    fig.imageObj.src);\n",
       "            }\n",
       "\n",
       "            fig.imageObj.src = (window.URL || window.webkitURL).createObjectURL(\n",
       "                evt.data);\n",
       "            fig.updated_canvas_event();\n",
       "            fig.waiting = false;\n",
       "            return;\n",
       "        }\n",
       "        else if (typeof evt.data === 'string' && evt.data.slice(0, 21) == \"data:image/png;base64\") {\n",
       "            fig.imageObj.src = evt.data;\n",
       "            fig.updated_canvas_event();\n",
       "            fig.waiting = false;\n",
       "            return;\n",
       "        }\n",
       "\n",
       "        var msg = JSON.parse(evt.data);\n",
       "        var msg_type = msg['type'];\n",
       "\n",
       "        // Call the  \"handle_{type}\" callback, which takes\n",
       "        // the figure and JSON message as its only arguments.\n",
       "        try {\n",
       "            var callback = fig[\"handle_\" + msg_type];\n",
       "        } catch (e) {\n",
       "            console.log(\"No handler for the '\" + msg_type + \"' message type: \", msg);\n",
       "            return;\n",
       "        }\n",
       "\n",
       "        if (callback) {\n",
       "            try {\n",
       "                // console.log(\"Handling '\" + msg_type + \"' message: \", msg);\n",
       "                callback(fig, msg);\n",
       "            } catch (e) {\n",
       "                console.log(\"Exception inside the 'handler_\" + msg_type + \"' callback:\", e, e.stack, msg);\n",
       "            }\n",
       "        }\n",
       "    };\n",
       "}\n",
       "\n",
       "// from http://stackoverflow.com/questions/1114465/getting-mouse-location-in-canvas\n",
       "mpl.findpos = function(e) {\n",
       "    //this section is from http://www.quirksmode.org/js/events_properties.html\n",
       "    var targ;\n",
       "    if (!e)\n",
       "        e = window.event;\n",
       "    if (e.target)\n",
       "        targ = e.target;\n",
       "    else if (e.srcElement)\n",
       "        targ = e.srcElement;\n",
       "    if (targ.nodeType == 3) // defeat Safari bug\n",
       "        targ = targ.parentNode;\n",
       "\n",
       "    // jQuery normalizes the pageX and pageY\n",
       "    // pageX,Y are the mouse positions relative to the document\n",
       "    // offset() returns the position of the element relative to the document\n",
       "    var x = e.pageX - $(targ).offset().left;\n",
       "    var y = e.pageY - $(targ).offset().top;\n",
       "\n",
       "    return {\"x\": x, \"y\": y};\n",
       "};\n",
       "\n",
       "/*\n",
       " * return a copy of an object with only non-object keys\n",
       " * we need this to avoid circular references\n",
       " * http://stackoverflow.com/a/24161582/3208463\n",
       " */\n",
       "function simpleKeys (original) {\n",
       "  return Object.keys(original).reduce(function (obj, key) {\n",
       "    if (typeof original[key] !== 'object')\n",
       "        obj[key] = original[key]\n",
       "    return obj;\n",
       "  }, {});\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.mouse_event = function(event, name) {\n",
       "    var canvas_pos = mpl.findpos(event)\n",
       "\n",
       "    if (name === 'button_press')\n",
       "    {\n",
       "        this.canvas.focus();\n",
       "        this.canvas_div.focus();\n",
       "    }\n",
       "\n",
       "    var x = canvas_pos.x * mpl.ratio;\n",
       "    var y = canvas_pos.y * mpl.ratio;\n",
       "\n",
       "    this.send_message(name, {x: x, y: y, button: event.button,\n",
       "                             step: event.step,\n",
       "                             guiEvent: simpleKeys(event)});\n",
       "\n",
       "    /* This prevents the web browser from automatically changing to\n",
       "     * the text insertion cursor when the button is pressed.  We want\n",
       "     * to control all of the cursor setting manually through the\n",
       "     * 'cursor' event from matplotlib */\n",
       "    event.preventDefault();\n",
       "    return false;\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
       "    // Handle any extra behaviour associated with a key event\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.key_event = function(event, name) {\n",
       "\n",
       "    // Prevent repeat events\n",
       "    if (name == 'key_press')\n",
       "    {\n",
       "        if (event.which === this._key)\n",
       "            return;\n",
       "        else\n",
       "            this._key = event.which;\n",
       "    }\n",
       "    if (name == 'key_release')\n",
       "        this._key = null;\n",
       "\n",
       "    var value = '';\n",
       "    if (event.ctrlKey && event.which != 17)\n",
       "        value += \"ctrl+\";\n",
       "    if (event.altKey && event.which != 18)\n",
       "        value += \"alt+\";\n",
       "    if (event.shiftKey && event.which != 16)\n",
       "        value += \"shift+\";\n",
       "\n",
       "    value += 'k';\n",
       "    value += event.which.toString();\n",
       "\n",
       "    this._key_event_extra(event, name);\n",
       "\n",
       "    this.send_message(name, {key: value,\n",
       "                             guiEvent: simpleKeys(event)});\n",
       "    return false;\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.toolbar_button_onclick = function(name) {\n",
       "    if (name == 'download') {\n",
       "        this.handle_save(this, null);\n",
       "    } else {\n",
       "        this.send_message(\"toolbar_button\", {name: name});\n",
       "    }\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.toolbar_button_onmouseover = function(tooltip) {\n",
       "    this.message.textContent = tooltip;\n",
       "};\n",
       "mpl.toolbar_items = [[\"Home\", \"Reset original view\", \"fa fa-home icon-home\", \"home\"], [\"Back\", \"Back to previous view\", \"fa fa-arrow-left icon-arrow-left\", \"back\"], [\"Forward\", \"Forward to next view\", \"fa fa-arrow-right icon-arrow-right\", \"forward\"], [\"\", \"\", \"\", \"\"], [\"Pan\", \"Pan axes with left mouse, zoom with right\", \"fa fa-arrows icon-move\", \"pan\"], [\"Zoom\", \"Zoom to rectangle\", \"fa fa-square-o icon-check-empty\", \"zoom\"], [\"\", \"\", \"\", \"\"], [\"Download\", \"Download plot\", \"fa fa-floppy-o icon-save\", \"download\"]];\n",
       "\n",
       "mpl.extensions = [\"eps\", \"jpeg\", \"pdf\", \"png\", \"ps\", \"raw\", \"svg\", \"tif\"];\n",
       "\n",
       "mpl.default_extension = \"png\";var comm_websocket_adapter = function(comm) {\n",
       "    // Create a \"websocket\"-like object which calls the given IPython comm\n",
       "    // object with the appropriate methods. Currently this is a non binary\n",
       "    // socket, so there is still some room for performance tuning.\n",
       "    var ws = {};\n",
       "\n",
       "    ws.close = function() {\n",
       "        comm.close()\n",
       "    };\n",
       "    ws.send = function(m) {\n",
       "        //console.log('sending', m);\n",
       "        comm.send(m);\n",
       "    };\n",
       "    // Register the callback with on_msg.\n",
       "    comm.on_msg(function(msg) {\n",
       "        //console.log('receiving', msg['content']['data'], msg);\n",
       "        // Pass the mpl event to the overridden (by mpl) onmessage function.\n",
       "        ws.onmessage(msg['content']['data'])\n",
       "    });\n",
       "    return ws;\n",
       "}\n",
       "\n",
       "mpl.mpl_figure_comm = function(comm, msg) {\n",
       "    // This is the function which gets called when the mpl process\n",
       "    // starts-up an IPython Comm through the \"matplotlib\" channel.\n",
       "\n",
       "    var id = msg.content.data.id;\n",
       "    // Get hold of the div created by the display call when the Comm\n",
       "    // socket was opened in Python.\n",
       "    var element = $(\"#\" + id);\n",
       "    var ws_proxy = comm_websocket_adapter(comm)\n",
       "\n",
       "    function ondownload(figure, format) {\n",
       "        window.open(figure.imageObj.src);\n",
       "    }\n",
       "\n",
       "    var fig = new mpl.figure(id, ws_proxy,\n",
       "                           ondownload,\n",
       "                           element.get(0));\n",
       "\n",
       "    // Call onopen now - mpl needs it, as it is assuming we've passed it a real\n",
       "    // web socket which is closed, not our websocket->open comm proxy.\n",
       "    ws_proxy.onopen();\n",
       "\n",
       "    fig.parent_element = element.get(0);\n",
       "    fig.cell_info = mpl.find_output_cell(\"<div id='\" + id + \"'></div>\");\n",
       "    if (!fig.cell_info) {\n",
       "        console.error(\"Failed to find cell for figure\", id, fig);\n",
       "        return;\n",
       "    }\n",
       "\n",
       "    var output_index = fig.cell_info[2]\n",
       "    var cell = fig.cell_info[0];\n",
       "\n",
       "};\n",
       "\n",
       "mpl.figure.prototype.handle_close = function(fig, msg) {\n",
       "    var width = fig.canvas.width/mpl.ratio\n",
       "    fig.root.unbind('remove')\n",
       "\n",
       "    // Update the output cell to use the data from the current canvas.\n",
       "    fig.push_to_output();\n",
       "    var dataURL = fig.canvas.toDataURL();\n",
       "    // Re-enable the keyboard manager in IPython - without this line, in FF,\n",
       "    // the notebook keyboard shortcuts fail.\n",
       "    IPython.keyboard_manager.enable()\n",
       "    $(fig.parent_element).html('<img src=\"' + dataURL + '\" width=\"' + width + '\">');\n",
       "    fig.close_ws(fig, msg);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.close_ws = function(fig, msg){\n",
       "    fig.send_message('closing', msg);\n",
       "    // fig.ws.close()\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.push_to_output = function(remove_interactive) {\n",
       "    // Turn the data on the canvas into data in the output cell.\n",
       "    var width = this.canvas.width/mpl.ratio\n",
       "    var dataURL = this.canvas.toDataURL();\n",
       "    this.cell_info[1]['text/html'] = '<img src=\"' + dataURL + '\" width=\"' + width + '\">';\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.updated_canvas_event = function() {\n",
       "    // Tell IPython that the notebook contents must change.\n",
       "    IPython.notebook.set_dirty(true);\n",
       "    this.send_message(\"ack\", {});\n",
       "    var fig = this;\n",
       "    // Wait a second, then push the new image to the DOM so\n",
       "    // that it is saved nicely (might be nice to debounce this).\n",
       "    setTimeout(function () { fig.push_to_output() }, 1000);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._init_toolbar = function() {\n",
       "    var fig = this;\n",
       "\n",
       "    var nav_element = $('<div/>')\n",
       "    nav_element.attr('style', 'width: 100%');\n",
       "    this.root.append(nav_element);\n",
       "\n",
       "    // Define a callback function for later on.\n",
       "    function toolbar_event(event) {\n",
       "        return fig.toolbar_button_onclick(event['data']);\n",
       "    }\n",
       "    function toolbar_mouse_event(event) {\n",
       "        return fig.toolbar_button_onmouseover(event['data']);\n",
       "    }\n",
       "\n",
       "    for(var toolbar_ind in mpl.toolbar_items){\n",
       "        var name = mpl.toolbar_items[toolbar_ind][0];\n",
       "        var tooltip = mpl.toolbar_items[toolbar_ind][1];\n",
       "        var image = mpl.toolbar_items[toolbar_ind][2];\n",
       "        var method_name = mpl.toolbar_items[toolbar_ind][3];\n",
       "\n",
       "        if (!name) { continue; };\n",
       "\n",
       "        var button = $('<button class=\"btn btn-default\" href=\"#\" title=\"' + name + '\"><i class=\"fa ' + image + ' fa-lg\"></i></button>');\n",
       "        button.click(method_name, toolbar_event);\n",
       "        button.mouseover(tooltip, toolbar_mouse_event);\n",
       "        nav_element.append(button);\n",
       "    }\n",
       "\n",
       "    // Add the status bar.\n",
       "    var status_bar = $('<span class=\"mpl-message\" style=\"text-align:right; float: right;\"/>');\n",
       "    nav_element.append(status_bar);\n",
       "    this.message = status_bar[0];\n",
       "\n",
       "    // Add the close button to the window.\n",
       "    var buttongrp = $('<div class=\"btn-group inline pull-right\"></div>');\n",
       "    var button = $('<button class=\"btn btn-mini btn-primary\" href=\"#\" title=\"Stop Interaction\"><i class=\"fa fa-power-off icon-remove icon-large\"></i></button>');\n",
       "    button.click(function (evt) { fig.handle_close(fig, {}); } );\n",
       "    button.mouseover('Stop Interaction', toolbar_mouse_event);\n",
       "    buttongrp.append(button);\n",
       "    var titlebar = this.root.find($('.ui-dialog-titlebar'));\n",
       "    titlebar.prepend(buttongrp);\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._root_extra_style = function(el){\n",
       "    var fig = this\n",
       "    el.on(\"remove\", function(){\n",
       "\tfig.close_ws(fig, {});\n",
       "    });\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._canvas_extra_style = function(el){\n",
       "    // this is important to make the div 'focusable\n",
       "    el.attr('tabindex', 0)\n",
       "    // reach out to IPython and tell the keyboard manager to turn it's self\n",
       "    // off when our div gets focus\n",
       "\n",
       "    // location in version 3\n",
       "    if (IPython.notebook.keyboard_manager) {\n",
       "        IPython.notebook.keyboard_manager.register_events(el);\n",
       "    }\n",
       "    else {\n",
       "        // location in version 2\n",
       "        IPython.keyboard_manager.register_events(el);\n",
       "    }\n",
       "\n",
       "}\n",
       "\n",
       "mpl.figure.prototype._key_event_extra = function(event, name) {\n",
       "    var manager = IPython.notebook.keyboard_manager;\n",
       "    if (!manager)\n",
       "        manager = IPython.keyboard_manager;\n",
       "\n",
       "    // Check for shift+enter\n",
       "    if (event.shiftKey && event.which == 13) {\n",
       "        this.canvas_div.blur();\n",
       "        event.shiftKey = false;\n",
       "        // Send a \"J\" for go to next cell\n",
       "        event.which = 74;\n",
       "        event.keyCode = 74;\n",
       "        manager.command_mode();\n",
       "        manager.handle_keydown(event);\n",
       "    }\n",
       "}\n",
       "\n",
       "mpl.figure.prototype.handle_save = function(fig, msg) {\n",
       "    fig.ondownload(fig, null);\n",
       "}\n",
       "\n",
       "\n",
       "mpl.find_output_cell = function(html_output) {\n",
       "    // Return the cell and output element which can be found *uniquely* in the notebook.\n",
       "    // Note - this is a bit hacky, but it is done because the \"notebook_saving.Notebook\"\n",
       "    // IPython event is triggered only after the cells have been serialised, which for\n",
       "    // our purposes (turning an active figure into a static one), is too late.\n",
       "    var cells = IPython.notebook.get_cells();\n",
       "    var ncells = cells.length;\n",
       "    for (var i=0; i<ncells; i++) {\n",
       "        var cell = cells[i];\n",
       "        if (cell.cell_type === 'code'){\n",
       "            for (var j=0; j<cell.output_area.outputs.length; j++) {\n",
       "                var data = cell.output_area.outputs[j];\n",
       "                if (data.data) {\n",
       "                    // IPython >= 3 moved mimebundle to data attribute of output\n",
       "                    data = data.data;\n",
       "                }\n",
       "                if (data['text/html'] == html_output) {\n",
       "                    return [cell, data, j];\n",
       "                }\n",
       "            }\n",
       "        }\n",
       "    }\n",
       "}\n",
       "\n",
       "// Register the function which deals with the matplotlib target/channel.\n",
       "// The kernel may be null if the page has been refreshed.\n",
       "if (IPython.notebook.kernel != null) {\n",
       "    IPython.notebook.kernel.comm_manager.register_target('matplotlib', mpl.mpl_figure_comm);\n",
       "}\n"
      ],
      "text/plain": [
       "<IPython.core.display.Javascript object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "data": {
      "text/html": [
       "<img src=\"\" width=\"432\">"
      ],
      "text/plain": [
       "<IPython.core.display.HTML object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "Traceback (most recent call last):\n",
      "  File \"/home/bushuhui/.virtualenv/dl/lib/python3.5/site-packages/matplotlib/cbook/__init__.py\", line 215, in process\n",
      "    func(*args, **kwargs)\n",
      "  File \"/home/bushuhui/.virtualenv/dl/lib/python3.5/site-packages/matplotlib/animation.py\", line 1462, in _stop\n",
      "    self.event_source.remove_callback(self._loop_delay)\n",
      "AttributeError: 'NoneType' object has no attribute 'remove_callback'\n"
     ]
    }
   ],
   "source": [
    "%matplotlib nbagg\n",
    "\n",
    "import matplotlib.pyplot as plt\n",
    "import matplotlib.animation as animation\n",
    "\n",
    "n_epoch = 3000          # epoch size\n",
    "a, b = 1, 1             # initial parameters\n",
    "epsilon = 0.001         # learning rate\n",
    "\n",
    "fig = plt.figure()\n",
    "imgs = []\n",
    "\n",
    "for i in range(n_epoch):\n",
    "    for j in range(N):\n",
    "        a = a + epsilon*2*(Y[j] - a*X[j] - b)*X[j]\n",
    "        b = b + epsilon*2*(Y[j] - a*X[j] - b)\n",
    "\n",
    "    L = 0\n",
    "    for j in range(N):\n",
    "        L = L + (Y[j]-a*X[j]-b)**2\n",
    "    #print(\"epoch %4d: loss = %f, a = %f, b = %f\" % (i, L, a, b))\n",
    "    \n",
    "    if i % 50 == 0:\n",
    "        x_min = np.min(X)\n",
    "        x_max = np.max(X)\n",
    "        y_min = a * x_min + b\n",
    "        y_max = a * x_max + b\n",
    "\n",
    "        img = plt.scatter(X, Y, label='original data')\n",
    "        img = plt.plot([x_min, x_max], [y_min, y_max], 'r', label='model')\n",
    "        imgs.append(img)\n",
    "        \n",
    "ani = animation.ArtistAnimation(fig, imgs)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 4. 如何使用批次更新的方法？\n",
    "\n",
    "如果有一些数据包含比较大的错误（异常数据），因此每次更新仅仅使用一个数据会导致不精确，同时每次仅仅使用一个数据来计算更新也导致计算效率比较低。\n",
    "\n",
    "\n",
    "* [梯度下降方法的几种形式](https://blog.csdn.net/u010402786/article/details/51188876)"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 5. 如何拟合多项式函数？\n",
    "\n",
    "需要设计一个弹道导弹防御系统，通过观测导弹的飞行路径，预测未来导弹的飞行轨迹，从而完成摧毁的任务。按照物理学，可以得知模型为:\n",
    "$$\n",
    "y = at^2 + bt + c\n",
    "$$\n",
    "我们需要求解三个模型参数$a, b, c$。\n",
    "\n",
    "损失函数的定义为：\n",
    "$$\n",
    "L = \\sum_{i=1}^N (y_i - at^2 - bt - c)^2\n",
    "$$\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAXoAAAD8CAYAAAB5Pm/hAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDMuMC4wLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvqOYd8AAAEo1JREFUeJzt3X+MndV95/H3pzYkA9tlCJlaMCZrqiB3V4mC6YglSxvt4qaENAoWSiOq3Y2FrLp/oDYpklvY/yqtlESuljb/oLWwus5uQkIJP6wsCkFAVu0foTvGFBOIG4eG4OGHpxSTTXB3gX73jzlOBheYOzN3fD2H90u6uuc5z3nu8z2y/Jlnzn3u3FQVkqR+/dyoC5AkrSyDXpI6Z9BLUucMeknqnEEvSZ0z6CWpcwa9JHXOoJekzhn0ktS5taMuAODd7353bdiwYdRlSNKqsm/fvr+rqomFxp0SQb9hwwamp6dHXYYkrSpJnhpknEs3ktQ5g16SOmfQS1LnDHpJ6pxBL0mdGyjok3w6yWNJvpPkM63vXUnuS/K99nx260+SLyQ5lOTRJBevVPF37Z/hss89wAU3/E8u+9wD3LV/ZqVOJUmr1oJBn+R9wG8DlwAfAD6W5L3ADcD9VXUhcH/bBrgSuLA9tgM3r0Dd3LV/hhvvOMDM0WMUMHP0GDfeccCwl6QTDHJF/y+Bh6rq5ap6FfhfwNXAVcCeNmYPsKW1rwK+WHO+DYwnOXfIdbPz3oMce+W11/Ude+U1dt57cNinkqRVbZCgfwz41STnJDkD+ChwPrCuqp5tY54D1rX2JPD0vOMPt77XSbI9yXSS6dnZ2UUX/szRY4vql6S3qwWDvqqeAD4PfBP4BvAI8NoJYwpY1LeMV9WuqpqqqqmJiQU/wftPnDc+tqh+SXq7GujN2KraXVW/XFUfAl4E/gZ4/viSTHs+0obPMHfFf9z61jdUO67YyNhpa17XN3baGnZcsXHYp5KkVW3Qu25+oT2/h7n1+S8De4GtbchW4O7W3gt8qt19cynw0rwlnqHZsmmSz179fibHxwgwOT7GZ69+P1s2/ZNVIkl6Wxv0j5p9Lck5wCvAdVV1NMnngNuSbAOeAj7Zxt7D3Dr+IeBl4Noh1/xTWzZNGuyStICBgr6qfvUN+l4ANr9BfwHXLb80SdIw+MlYSeqcQS9JnTPoJalzBr0kdc6gl6TOGfSS1DmDXpI6Z9BLUucMeknq3KB/AkEayF37Z9h570GeOXqM88bH2HHFRv9MhTRiBr2G5vi3fh3/Qpjj3/oFGPbSCLl0o6HxW7+kU5NBr6HxW7+kU5NBr6HxW7+kU5NBr6HxW7+kU5Nvxmpojr/h6l030qnFoNdQ+a1f0qnHpRtJ6pxBL0mdM+glqXMGvSR1bqCgT/L7Sb6T5LEktyZ5Z5ILkjyU5FCSryY5vY19R9s+1PZvWMkJSJLe2oJBn2QS+D1gqqreB6wBrgE+D9xUVe8FXgS2tUO2AS+2/pvaOEnSiAy6dLMWGEuyFjgDeBa4HLi97d8DbGntq9o2bf/mJBlOuZKkxVow6KtqBvhj4IfMBfxLwD7gaFW92oYdBo7fPD0JPN2OfbWNP+fE102yPcl0kunZ2dnlzkOS9CYGWbo5m7mr9AuA84AzgY8s98RVtauqpqpqamJiYrkvJ0l6E4Ms3fwa8LdVNVtVrwB3AJcB420pB2A9MNPaM8D5AG3/WcALQ61akjSwQYL+h8ClSc5oa+2bgceBB4FPtDFbgbtbe2/bpu1/oKpqeCVLkhZjkDX6h5h7U/Vh4EA7Zhfwh8D1SQ4xtwa/ux2yGzin9V8P3LACdUuSBpRT4WJ7amqqpqenR12GJK0qSfZV1dRC4/xkrCR1zqCXpM4Z9JLUOYNekjpn0EtS5wx6SeqcQS9JnTPoJalzBr0kdc6gl6TOGfSS1DmDXpI6Z9BLUucMeknqnEEvSZ0z6CWpcwa9JHXOoJekzhn0ktQ5g16SOrdg0CfZmOSReY8fJflMkncluS/J99rz2W18knwhyaEkjya5eOWnIUl6MwsGfVUdrKqLquoi4JeBl4E7gRuA+6vqQuD+tg1wJXBhe2wHbl6JwiVJg1ns0s1m4PtV9RRwFbCn9e8BtrT2VcAXa863gfEk5w6lWknSoi026K8Bbm3tdVX1bGs/B6xr7Ung6XnHHG59kqQRGDjok5wOfBz48xP3VVUBtZgTJ9meZDrJ9Ozs7GIOlSQtwmKu6K8EHq6q59v288eXZNrzkdY/A5w/77j1re91qmpXVU1V1dTExMTiK5ckDWQxQf9b/GzZBmAvsLW1twJ3z+v/VLv75lLgpXlLPJKkk2ztIIOSnAl8GPided2fA25Lsg14Cvhk678H+ChwiLk7dK4dWrWSpEUbKOir6ifAOSf0vcDcXTgnji3guqFUJ0laNj8ZK0mdM+glqXMGvSR1zqCXpM4Z9JLUOYNekjpn0EtS5wx6SeqcQS9JnTPoJalzBr0kdc6gl6TOGfSS1DmDXpI6Z9BLUucMeknq3EBfPCJp9bpr/ww77z3IM0ePcd74GDuu2MiWTZOjLksnkUEvdeyu/TPceMcBjr3yGgAzR49x4x0HAAz7txGXbqSO7bz34E9D/rhjr7zGznsPjqgijYJBL3XsmaPHFtWvPhn0UsfOGx9bVL/6NFDQJxlPcnuS7yZ5IskHk7wryX1Jvteez25jk+QLSQ4leTTJxSs7BUlvZscVGxk7bc3r+sZOW8OOKzaOqCKNwqBX9H8KfKOqfgn4APAEcANwf1VdCNzftgGuBC5sj+3AzUOtWNLAtmya5LNXv5/J8TECTI6P8dmr3+8bsW8zqaq3HpCcBTwC/GLNG5zkIPBvq+rZJOcC36qqjUn+a2vfeuK4NzvH1NRUTU9PD2E6kvT2kWRfVU0tNG6QK/oLgFngz5LsT3JLkjOBdfPC+zlgXWtPAk/PO/5w65MkjcAgQb8WuBi4uao2AT/hZ8s0ALQr/bf+1eAESbYnmU4yPTs7u5hDJUmLMEjQHwYOV9VDbft25oL/+bZkQ3s+0vbPAOfPO35963udqtpVVVNVNTUxMbHU+iVJC1gw6KvqOeDpJMffpt8MPA7sBba2vq3A3a29F/hUu/vmUuClt1qflyStrEH/BMLvAl9KcjrwJHAtcz8kbkuyDXgK+GQbew/wUeAQ8HIbK0kakYGCvqoeAd7ond3NbzC2gOuWWZckaUj8ZKwkdc6gl6TOGfSS1DmDXpI6Z9BLUucMeknqnEEvSZ0z6CWpcwa9JHXOoJekzhn0ktQ5g16SOmfQS1LnDHpJ6pxBL0mdM+glqXMGvSR1zqCXpM4Z9JLUOYNekjpn0EtS5wYK+iQ/SHIgySNJplvfu5Lcl+R77fns1p8kX0hyKMmjSS5eyQlIkt7aYq7o/11VXVRVU237BuD+qroQuL9tA1wJXNge24Gbh1WsJGnxlrN0cxWwp7X3AFvm9X+x5nwbGE9y7jLOI0lahkGDvoBvJtmXZHvrW1dVz7b2c8C61p4Enp537OHWJ0kagbUDjvuVqppJ8gvAfUm+O39nVVWSWsyJ2w+M7QDvec97FnOoJGkRBrqir6qZ9nwEuBO4BHj++JJMez7Shs8A5887fH3rO/E1d1XVVFVNTUxMLH0GkqS3tGDQJzkzyc8fbwO/DjwG7AW2tmFbgbtbey/wqXb3zaXAS/OWeCRJJ9kgSzfrgDuTHB//5ar6RpL/DdyWZBvwFPDJNv4e4KPAIeBl4NqhVy1JGtiCQV9VTwIfeIP+F4DNb9BfwHVDqU6StGx+MlaSOmfQS1LnDHpJ6pxBL0mdM+glqXMGvSR1zqCXpM4Z9JLUOYNekjpn0EtS5wx6SeqcQS9JnTPoJalzBr0kdc6gl6TOGfSS1DmDXpI6Z9BLUucMeknqnEEvSZ0z6CWpcwMHfZI1SfYn+XrbviDJQ0kOJflqktNb/zva9qG2f8PKlC5JGsRirug/DTwxb/vzwE1V9V7gRWBb698GvNj6b2rjJEkjMlDQJ1kP/AZwS9sOcDlwexuyB9jS2le1bdr+zW28JGkEBr2i/xPgD4B/bNvnAEer6tW2fRiYbO1J4GmAtv+lNl6SNAILBn2SjwFHqmrfME+cZHuS6STTs7Ozw3xpSdI8g1zRXwZ8PMkPgK8wt2Tzp8B4krVtzHpgprVngPMB2v6zgBdOfNGq2lVVU1U1NTExsaxJSJLe3IJBX1U3VtX6qtoAXAM8UFX/HngQ+EQbthW4u7X3tm3a/geqqoZatSRpYMu5j/4PgeuTHGJuDX53698NnNP6rwduWF6JkqTlWLvwkJ+pqm8B32rtJ4FL3mDMPwC/OYTaJElD4CdjJalzBr0kdc6gl6TOGfSS1DmDXpI6Z9BLUucMeknqnEEvSZ0z6CWpcwa9JHXOoJekzhn0ktQ5g16SOmfQS1LnDHpJ6pxBL0mdM+glqXMGvSR1zqCXpM4Z9JLUOYNekjq3YNAneWeSv0ry10m+k+SPWv8FSR5KcijJV5Oc3vrf0bYPtf0bVnYKkqS3MsgV/f8FLq+qDwAXAR9JcinweeCmqnov8CKwrY3fBrzY+m9q4yRJI7Jg0NecH7fN09qjgMuB21v/HmBLa1/Vtmn7NyfJ0CqWJC3KQGv0SdYkeQQ4AtwHfB84WlWvtiGHgcnWngSeBmj7XwLOGWbRkqTBDRT0VfVaVV0ErAcuAX5puSdOsj3JdJLp2dnZ5b6cJOlNLOqum6o6CjwIfBAYT7K27VoPzLT2DHA+QNt/FvDCG7zWrqqaqqqpiYmJJZYvSVrIIHfdTCQZb+0x4MPAE8wF/ifasK3A3a29t23T9j9QVTXMoiVJg1u78BDOBfYkWcPcD4bbqurrSR4HvpLkPwP7gd1t/G7gvyc5BPw9cM0K1C1JGtCCQV9VjwKb3qD/SebW60/s/wfgN4dSnSRp2fxkrCR1zqCXpM4Z9JLUOYNekjpn0EtS5wx6SeqcQS9JnTPoJalzBr0kdc6gl6TODfK3biRJQ3TX/hl23nuQZ44e47zxMXZcsZEtmyYXPnCJDHpJOonu2j/DjXcc4NgrrwEwc/QYN95xAGDFwt6lG0k6iXbee/CnIX/csVdeY+e9B1fsnAa9JJ1Ezxw9tqj+YTDoJekkOm98bFH9w2DQS9JJtOOKjYydtuZ1fWOnrWHHFRtX7Jy+GStJJ9HxN1y960aSOrZl0+SKBvuJXLqRpM4Z9JLUOYNekjpn0EtS5wx6SepcqmrUNZBkFnhqGS/xbuDvhlTOKPUyD+hnLr3MA5zLqWi58/gXVTWx0KBTIuiXK8l0VU2Nuo7l6mUe0M9cepkHOJdT0cmah0s3ktQ5g16SOtdL0O8adQFD0ss8oJ+59DIPcC6nopMyjy7W6CVJb66XK3pJ0ptYtUGf5PwkDyZ5PMl3knx61DUtVZJ3JvmrJH/d5vJHo65pOZKsSbI/yddHXctyJPlBkgNJHkkyPep6liPJeJLbk3w3yRNJPjjqmhYrycb2b3H88aMknxl1XUuV5Pfb//fHktya5J0rdq7VunST5Fzg3Kp6OMnPA/uALVX1+IhLW7QkAc6sqh8nOQ34S+DTVfXtEZe2JEmuB6aAf15VHxt1PUuV5AfAVFWt+vu1k+wB/qKqbklyOnBGVR0ddV1LlWQNMAP866pazmdwRiLJJHP/z/9VVR1LchtwT1X9t5U436q9oq+qZ6vq4db+P8ATwMn7u59DVHN+3DZPa49V+RM4yXrgN4BbRl2L5iQ5C/gQsBugqv7fag75ZjPw/dUY8vOsBcaSrAXOAJ5ZqROt2qCfL8kGYBPw0GgrWbq23PEIcAS4r6pW61z+BPgD4B9HXcgQFPDNJPuSbB91MctwATAL/FlbUrslyZmjLmqZrgFuHXURS1VVM8AfAz8EngVeqqpvrtT5Vn3QJ/lnwNeAz1TVj0Zdz1JV1WtVdRGwHrgkyftGXdNiJfkYcKSq9o26liH5laq6GLgSuC7Jh0Zd0BKtBS4Gbq6qTcBPgBtGW9LStaWnjwN/PupalirJ2cBVzP0QPg84M8l/WKnzreqgb+vZXwO+VFV3jLqeYWi/Uj8IfGTUtSzBZcDH29r2V4DLk/yP0Za0dO2qi6o6AtwJXDLaipbsMHB43m+JtzMX/KvVlcDDVfX8qAtZhl8D/raqZqvqFeAO4N+s1MlWbdC3NzB3A09U1X8ZdT3LkWQiyXhrjwEfBr472qoWr6purKr1VbWBuV+tH6iqFbtKWUlJzmxv8tOWOX4deGy0VS1NVT0HPJ3k+LdPbwZW3U0L8/wWq3jZpvkhcGmSM1qWbWbufcYVsZq/M/Yy4D8CB9raNsB/qqp7RljTUp0L7Gl3EvwccFtVrepbEzuwDrhz7v8ga4EvV9U3RlvSsvwu8KW27PEkcO2I61mS9kP3w8DvjLqW5aiqh5LcDjwMvArsZwU/Jbtqb6+UJA1m1S7dSJIGY9BLUucMeknqnEEvSZ0z6CWpcwa9JHXOoJekzhn0ktS5/w+JUTkl5rwGCgAAAABJRU5ErkJggg==\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "%matplotlib inline\n",
    "\n",
    "t = np.array([2, 4, 6, 8])\n",
    "#t = np.linspace(0, 10)\n",
    "\n",
    "pa = -20\n",
    "pb = 90\n",
    "pc = 800\n",
    "\n",
    "y = pa*t**2 + pb*t + pc\n",
    "\n",
    "\n",
    "plt.scatter(t, y)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "### 5.1 如何得到更新项?\n",
    "\n",
    "$$\n",
    "L = \\sum_{i=1}^N (y_i - at^2 - bt - c)^2\n",
    "$$\n",
    "\n",
    "\\begin{eqnarray}\n",
    "\\frac{\\partial L}{\\partial a} & = & - 2\\sum_{i=1}^N (y_i - at^2 - bt -c) t^2 \\\\\n",
    "\\frac{\\partial L}{\\partial b} & = & - 2\\sum_{i=1}^N (y_i - at^2 - bt -c) t \\\\\n",
    "\\frac{\\partial L}{\\partial c} & = & - 2\\sum_{i=1}^N (y_i - at^2 - bt -c)\n",
    "\\end{eqnarray}"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 6. 如何使用sklearn求解线性问题？\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "a = 949.435260, b = 152.133484\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {
      "needs_background": "light"
     },
     "output_type": "display_data"
    }
   ],
   "source": [
    "from sklearn import linear_model\n",
    "\n",
    "# load data\n",
    "d = datasets.load_diabetes()\n",
    "\n",
    "X = d.data[:, np.newaxis, 2]\n",
    "Y = d.target\n",
    "\n",
    "# create regression model\n",
    "regr = linear_model.LinearRegression()\n",
    "regr.fit(X, Y)\n",
    "\n",
    "a, b = regr.coef_, regr.intercept_\n",
    "print(\"a = %f, b = %f\" % (a, b))\n",
    "\n",
    "x_min = np.min(X)\n",
    "x_max = np.max(X)\n",
    "y_min = a * x_min + b\n",
    "y_max = a * x_max + b\n",
    "\n",
    "plt.scatter(X, Y)\n",
    "plt.plot([x_min, x_max], [y_min, y_max], 'r')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 7. 如何使用sklearn拟合多项式函数？"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 10,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([800.,  90., -20.])"
      ]
     },
     "execution_count": 10,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "# Fitting polynomial functions\n",
    "\n",
    "from sklearn.preprocessing import PolynomialFeatures\n",
    "from sklearn.linear_model import LinearRegression\n",
    "from sklearn.pipeline import Pipeline\n",
    "\n",
    "t = np.array([2, 4, 6, 8])\n",
    "\n",
    "pa = -20\n",
    "pb = 90\n",
    "pc = 800\n",
    "\n",
    "y = pa*t**2 + pb*t + pc\n",
    "\n",
    "model = Pipeline([('poly', PolynomialFeatures(degree=2)),\n",
    "                  ('linear', LinearRegression(fit_intercept=False))])\n",
    "model = model.fit(t[:, np.newaxis], y)\n",
    "model.named_steps['linear'].coef_\n"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.5.2"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
